为什么我的 SQL ALL 运算符没有返回任何结果?

Why is my SQL ALL operator returning no results?

我正在使用 TSQL 并希望根据 StatusID 字段从 Persons 的 table 中 select 数据,如果所有人的出院日期早于今天。

一个人可以有多个出院日期。

我正在尝试对 ALL 使用子查询来检查他们的所有出院日期是否都在今天之前,但它不起作用。

我做错了什么?

或者有比 SQL ALL 更好的方法吗?

这是我试过的代码示例:

select distinct  per.PersonNo 
from PersonInfo per, Cases cas
left join Cases cas on per.PersonNo = cas.PersonNo
where (per.StatusID = 3012 
and per.PersonNo = ALL (SELECT cas.PersonNo FROM Cases cas WHERE cas.DischargeDate < getdate() ))

我知道我的一些测试数据是正确的 StatusID 并且他们所有的出院日期都在今天之前,他们没有得到 selected 但他们应该得到。

我的查询returns没有结果。

试试这个:

select  distinct per.PersonNo
from    PersonInfo per, Cases cas
        left join Cases cas on per.PersonNo = cas.PersonNo
where   (
            per.StatusID = 3012
            and per.PersonNo = ALL 
            (
                SELECT  cas.PersonNo 
                FROM    Cases cas 
                WHERE   cas.DischargeDate < getdate()
                        and cas.PersonNo = per.PersonNo -- this limits the subquery's PersonNo value to the value that the outer query is expecting
            )
        )

您的连接语法有误,为什么要比较 PersonNo 而不是日期?
试试这个:

select distinct per.PersonNo
from PersonInfo per left join Cases cas 
on per.PersonNo = cas.PersonNo
where per.StatusID = 3012
and (select max(DischargeDate) from Cases where PersonNo = cas.PersonNo) < cast(getdate() as date)

如果您希望没有出院日期的人今天(或将来?)相同,那么您可以使用 not exists:

select distinct P.PersonNo
  from PersonInfo as P left outer join
    Cases as C on C.PersonNo = P.PersonNo
    where P.StatusId = 3012 and
      not exists ( select 42 from Cases as IC where IC.PersonNo = P.PersonNo and IC.DischargeDate >= Cast( GetDate( ) as Date ) );

请注意,对 Cases table 的两个引用使用了不同的别名,并且子查询与外部查询 (IC.PersonNo = P.PersonNo).

相关联

cast用来消去GetDate的时间。这避免了 DischargeDate 的问题,如果它恰好是 DateTime 而不是 Date。提示:共享 table 的 DDL 并提供示例数据和所需结果有助于我们帮助您。