【发布时间】:2014-12-28 05:02:28
【问题描述】:
脚本目标:从一个列表中获取一个数字列表,其中数字没有出现在另一个列表中。
复杂性:其他数字列表只能通过复杂的脚本获得 - 出于某种原因,当我知道应该有结果时却没有得到结果;因为第一个列表将包含所有数字,而第二个数字列表将仅包含一些数字;所以我应该得到一些结果。
我写的剧本(审查)
SELECT A.Number
FROM sometable AS A
INNER JOIN othertable AS B
ON A.Data = B.Data
INNER JOIN othertable2 AS C
ON B.Data = C.Data
INNER JOIN othertable3 AS D
ON C.Data = D.Data
WHERE D.Data = 'int'
AND NOT EXISTS (SELECT DISTINCT A.Number
FROM sometable AS C
anothertable AS B
ON C.Data = B.Data
INNER JOIN anothertable AS E
ON B.Data = E.Data
INNER JOIN anothertable AS A
ON E.Data = A.Data
CROSS apply (SELECT DG.Data
FROM atable AS DG
WHERE B.Data = DG.Data) D
WHERE D.Data IN ( 'int', 'int', 'int', 'int' ))
如果我运行第 1 部分(在不存在之前)它工作正常
如果我运行第 2 部分(不存在的数据),它也可以正常工作 - 结果不同且更少(包含第 1 部分中的数字)
但他们没有在一起。所以我需要知道如何做到这一点,如果不存在不是我需要使用的?
【问题讨论】:
-
您不存在与子查询一起使用,您的子查询使用与外部查询相同的表和别名。这将防止它成为一个相关的子查询,并且可能是您的问题来自哪里。此外,在 IN 列表中包含相同的项目并没有任何用处。
-
仅供参考:在
EXIST查询中使用DISTINCT是没有用的。查询返回的什么并不重要,只要行数:零或大于零。 -
看起来子查询中有错字
..sometable AS C anothertable AS B..应该是..sometable AS C Inner Join anothertable AS B..缺少Inner Join -
我使用的方法不存在,这是整个问题。我想我现在明白了。 PM 77-1 的回应对我来说很有意义。 @NoDisplayName - 两个查询中的表不一样;但数据将具有可比性。我试图从真实版本中简化。我确实错过了演示脚本中不存在的内部连接声明;但不是真的。
标签: sql-server sql-server-2005 not-exists cross-apply