如何使用 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 语句以及主表上的条件获取匹配记录的主要内容,如果未能解决你的问题,请参考以下文章

将数据添加到主表上的多个记录的链接表中

如何在具有匹配列的另一个表上插入 - WHERE NOT EXISTS?

如何计算联接表上的行数

SQL里IN的用法以及优化

如何在主表上加入按天聚合的数据

MYSQL:与 Group_Concatenate 一起使用的两个表上的左连接