SQL Server语言 - 如何在选择查询中确定条件位置的优先级



我有一个数据库表(比如学生(,其中包含以下示例数据

Name   ID    Active  admissionDate ReleaseDate  Nationality
John   3572  1       06/02/2014    06/02/2018   0
Sandy  2748  1       06/02/2013    11/01/2016   1

现在我想选择总共 10000 名学生。第一个条件是活动 = 1(假设有 7000 名这样的学生(。第二个条件是国籍 = 1(其余 3000 名学生作为所需学生总数为 10K(。全部按入院日期计算

我想在这里实现的目标应该是总共 10000 名学生,但第一优先级将是活动 = 1,第二优先级将是国籍 = 1。最初,我根据第一个条件选择学生并存储在临时表中。然后我从 10000 中扣除临时表的计数,并选择剩余的具有第二个条件的学生并再次附加到临时表中。

但是我想在一次查询中实现它,因为原始表非常大并且需要太多执行时间。如果您需要更多说明,请告诉我。

您可以将order by与所需的条件一起使用:

select top (1000) s.*
from students s
order by (case when Active = 1 then 1
               when Nationality = 1 then 2
               else 3
          end),
         AdmissionDate desc;

这假设您首先想要最近的录取。 如果您首先想要最早的,只需删除desc即可。

这有点在黑暗中刺痛,但我认为这很容易通过ORDER BYCASE的表达来解决。然而,这是伪sql:

WITH Students AS(
    SELECT TOP 10000 [YourColumns]
    FROM Student S
    ORDER BY CASE WHEN Active = 1 THEN 1 ELSE 0 END DESC
             CASE WHEN Nationality = 1 THEN 1 ELSE 0 END DESC
             CASE WHEN ... )
SELECT *
FROM Students
ORDER BY AdmissionDate;

这意味着您不会在WHERE子句中限制数据集,但是,需要首先对数据进行排序,首先将处于活动状态的数据推到顶部,然后是国籍为 1 的数据,依此类推。

最新更新