为什么我的 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 并提供示例数据和所需结果有助于我们帮助您。
我正在使用 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 并提供示例数据和所需结果有助于我们帮助您。