如何使用 Exists 语句以及主表上的条件获取匹配记录
Posted
技术标签:
【中文标题】如何使用 Exists 语句以及主表上的条件获取匹配记录【英文标题】:How to Get matching records using Exists statement along with a condition on the main table 【发布时间】:2017-05-10 13:50:55 【问题描述】:我对 sql 'exists' 语句有疑问,我将非常感谢任何形式的帮助。 让我解释一下我需要完成什么。
我有两个表,我想从 table1 中获取匹配的记录,这些记录也存在于 table2 中。到此为止,很简单。但是,我还想从 table1 中获取这些记录以及在 Table1 中具有特定列 NULL 的匹配记录。换句话说,我需要从 Table1 中获取这些记录,要么它们存在于 Table2 中,要么它们具有特定的 NULL 列。我编写了以下查询来完成此操作。
CREATE TABLE #Table1(ID INT, Column2 INT NULL)
CREATE TABLE #Table2(ID INT)
INSERT INTO #Table1 VALUES(1, NULL)
INSERT INTO #Table2 VALUES(2)
select * from #Table1
WHERE EXISTS (SELECT NULL from #Table2 where #Table2.ID = #Table1.ID OR #Table1.Column2 IS NULL)
DROP TABLE #Table1;
DROP TABLE #Table2;
当 Table2 不为空时,此查询有效。但是,如果 Table2 为空,则 IS NULL 条件不起作用。
为了解决这个问题,我还尝试通过添加联合来添加一个虚拟记录,以防 Table2 为空,但它也不能解决我的问题,因为当我应该获得 0 条记录时总会有一条记录。
这样
select * from #Table1
WHERE EXISTS (SELECT ID WHERE NOT EXISTS (SELECT * FROM #Table2)
UNION
SELECT NULL from #Table2 where #Table2.ID = #Table1.ID OR #Table1.Column2 IS NULL)
注意:我知道这可以使用连接来解决,但我想使用 Exists 语句来解决它,因为这是一个大型系统的一部分,根本无法转换为连接。我已经将上述内容作为一个简单的场景。
我们将不胜感激任何形式的帮助。
【问题讨论】:
【参考方案1】:这行得通吗?
WHERE EXISTS (SELECT 1 from #Table2 where #Table2.ID = #Table1.ID) OR #Table1.Column2 IS NULL
【讨论】:
请看我对第一个答案的评论。 你不需要多次写IS NULL
,你可以这样做:where (your_bunch_of_exists_statement) OR (#Table1.column2 IS NULL)
实际上有很多列需要检查 NULL。每个存在都包含一个单独的列以检查 Null。抱歉,一开始我以简单的方式发布了问题【参考方案2】:
将条件移到EXISTS
之外。无论如何,它更接近您描述问题的方式:
select t1.*
from #Table1 t1.
WHERE t1.Column2 IS NULL OR
EXISTS (SELECT 1 from #Table2 t2 where t2.ID = t1.ID);
注意事项:
虽然EXISTS (SELECT NULL . . . )
被允许作为作品,但我认为它具有很大的误导性。在实践中,NULL
经常表示缺失 值,因此结果是有点认知失调。此外,SELECT 1
更容易输入。
我推荐表别名;它们使查询更易于编写和阅读。
【讨论】:
感谢您的回复。但是,我担心这不会有帮助,因为我有许多与 AND 相关联的 Exists 的实际场景。因此,我不能将 IsNull 条件排除在出口之外。真正的查询是这样的。 FROM #TempOrders temp WHERE 存在()AND 存在()AND 存在()AND 存在()AND 存在()AND 存在() @youngseagul 。 . .所以?只需使用多个exists
表达式并在它们周围加上括号。以上是关于如何使用 Exists 语句以及主表上的条件获取匹配记录的主要内容,如果未能解决你的问题,请参考以下文章