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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

现在我要选择总共10000名学生。第一个条件是Active = 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表达来解决。这是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的数据等等等等。

以上是关于SQL Server - 如何确定select查询中条件的优先级的主要内容,如果未能解决你的问题,请参考以下文章

Oracle, SQL Server, My SQL如何实现数据分页查询语句

如何将 MS-SQL Server SELECT 查询转换/迁移到 Oracle 和 MySQL?

SQL Server 数据库的SELECT 语句基本用法介绍

如何从 SQL Server 2014 中的 Select 查询中将数据分配给用户定义的表类型

SQL Server 如何查询最后一条记录

如何避免两次编写 SQL Server 查询以避免重复?