SQL Server - 如何确定select查询中条件的优先级

Ank*_*kur 0 sql sql-server select

我有一个DB表(比如学生),它有以下样本数据

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
Run Code Online (Sandbox Code Playgroud)

现在我要选择总共10000名学生.第一个条件是Active = 1(比如有7000个这样的学生).第二个条件是国籍= 1(其余3000名学生,所需学生总数为10K).全部由入场日期提交

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

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

use*_*983 5

这有点盲目,但我认为这可以通过ORDER BYandCASE表达式轻松解决。然而,这是伪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;
Run Code Online (Sandbox Code Playgroud)

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


Gor*_*off 5

您可以使用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;
Run Code Online (Sandbox Code Playgroud)

这假设您首先需要最近的录取.desc如果您想要最早的那些,请放弃.