Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以以“阶段化”结果的方式编写SQL脚本?_Sql_Sql Server 2008 - Fatal编程技术网

是否可以以“阶段化”结果的方式编写SQL脚本?

是否可以以“阶段化”结果的方式编写SQL脚本?,sql,sql-server-2008,Sql,Sql Server 2008,如果我有一个人员表,并且有一个“年龄”列,我想查询它,我可以这样做 从年龄=30岁的人群中选择* 如果我想限制它,我可以放一个顶部 从年龄=30岁的人群中选择前100名* 但是作为我想要的一个例子,我想知道,如果我能得到所有30岁的人,如果少于100,得到25岁的人,如果仍然少于100,得到所有叫“杰夫”的人 通常我会做伪代码警告: SELECT TOP 100 * FROM people WHERE age = 30 if results < 100 SELECT TOP (100

如果我有一个人员表,并且有一个“年龄”列,我想查询它,我可以这样做

从年龄=30岁的人群中选择*

如果我想限制它,我可以放一个顶部

从年龄=30岁的人群中选择前100名*

但是作为我想要的一个例子,我想知道,如果我能得到所有30岁的人,如果少于100,得到25岁的人,如果仍然少于100,得到所有叫“杰夫”的人

通常我会做伪代码警告:

SELECT TOP 100 * FROM people WHERE age = 30

if results < 100

SELECT TOP (100 - previousResultCount) * FROM people WHERE age = 25

if results < 100

SELECT TOP (100 - previousResultCounts) * FROM people WHERE name = 'jeff'
以上是一个简单的例子。我实际上在做的是全文搜索查询,例如,显示结果,其中name=query,name包含query,name包含query中的所有单词,但顺序不同,等等。我想将它们全部合并到一个查询中,因为我认为这会快得多,特别是如果我添加额外的where子句,例如age=30

我总是想要100个结果回来,他们总是要排名,使完美的匹配出现在第一位。如果数据杂乱无章,我将上面的操作作为一个查询来执行,其中a、b或c我将不得不使用上面的第三列来进行排序并与TOP一起使用

我担心的是,如果我以某种方式包含一个等级,然后按该等级排序并选择顶部,它将进行大量不必要的计算,例如,它可能需要计算数据库中的每一行来获得等级,以便将其排序,我希望避免这种情况


这有意义吗?

您必须引入一个计算列来帮助您进行排序:

SELECT TOP 100 * FROM people where age in (30,25) or name = 'jeff' 
order by age desc
SELECT TOP 100 *
,CASE 
   WHEN age = 30 THEN 1 
   WHEN age = 25 THEN 2 
   WHEN name='jeff' THEN 3 
   ELSE 4 
 END stage
FROM people 
ORDER BY stage ASC

问题是,这难道不需要经历一段时间,让每个人的年龄都能订购吗?相反,如果年龄=30,这是一个cpu密集型函数,它必须为每一个函数计算它,对吗?错,此查询将首先列出所有年龄大于30岁的Jeff。它似乎也不会分段查询或在结果中包含排名。这很酷,解释了如何获得排名。但不幸的是,如果WHERE子句使用CPU密集型函数,它将不得不计算所有这些函数——我的数据库有100万行,因此尝试分期执行。但也许这是不可能的。你有两个选择:要么把查询改成生日介于…和。。。或者每天预先计算年龄栏。当你推出自己的全文搜索引擎时,你确定使用现有产品不会更好吗?如果是的话,就有好几吨。
SELECT TOP 100 *
,CASE 
   WHEN age = 30 THEN 1 
   WHEN age = 25 THEN 2 
   WHEN name='jeff' THEN 3 
   ELSE 4 
 END stage
FROM people 
ORDER BY stage ASC