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

问题描述 投票:0回答:2

我有一个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

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

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

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

sql sql-server select
2个回答
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;

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


4
投票

这在黑暗中有点刺,但我认为这很容易通过ORDER BYCASE表达来解决。这是psuedo-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的数据等等等等。

© www.soinside.com 2019 - 2024. All rights reserved.