【发布时间】:2019-09-24 18:00:33
【问题描述】:
有两张桌子。 Customers 与 custid 作为 PK 和 Orders 与 custid 作为 FK。
Customers 表有列custid、companyname
Orders 表有列custid、orderid、orderdate
我想退回在 2007 年而不是在 '2008' 订购的客户。我想在最终结果中返回custid 和companyname。
我有 query1 可以获取正确的结果,总共有 7 个不同的 custid
我有 query2,它给了我更多不同的行,即最终结果中有 86 行
查询1
SELECT custid, companyname
FROM customers c
WHER EXISTS
(SELECT custid
FROM orders o
WHERE YEAR(orderdate) = '2007'AND o.custid = c.custid)
AND NOT EXISTS
(SELECT custid
FROM orders o
WHERE YEAR(orderdate) = '2008'AND o.custid=c.custid)
查询2
SELECT DISTINCT custid, companyname
FROM customers c
WHERE EXISTS
(SELECT custid
FROM orders o
WHERE YEAR(orderdate) = '2007'
AND YEAR(orderdate) <> '2008'
AND o.custid=c.custid)
我不明白 query2 的问题以及为什么它不能给出正确的结果?
【问题讨论】:
-
能否请您提供两个表中的一些示例数据以供我们使用?
-
code2 中的子查询将有效地查询 2007 年的所有客户。请记住,条件是按行计算的:如果第一个条件 (
= 2017) 成立,则第二个条件 (<> 2018) 成立根据定义。 -
当您说
YEAR(orderdate) = '2007'时,它永远不会是其他任何东西(条件是每行),除非您引入OR条件.具体值不能同时为 2007 和其他值。
标签: sql sql-server tsql sql-server-2012 exists