连接表中没有内容时的 SQL 选择

Posted

技术标签:

【中文标题】连接表中没有内容时的 SQL 选择【英文标题】:SQL Select When Something IS NOT IN a Joined Table 【发布时间】:2013-03-15 11:28:50 【问题描述】:

好的。我在一个表中有一些数据,在多个场合引用了另一个表中的一些数据。

Table1 - 主客户表 表 2 - 用户定义字段

假设我有一个查询,显示来自 Table1 的客户端 ID 以及来自 Table2 的所有附加/使用的“使用定义字段”

SELECT t1.Id, t2.udf
FROM Table1 t1
JOIN Table2 t2 ON t1.Id = t2.Index
WHERE t1.EndDate IS NULL AND
      t1.Id = '1234.9876' AND

我会得到以下结果...

ID            UDF
1234.9876     100
1234.9876     110
1234.9876     118
1234.9876     124
1234.9876     198
1234.9876     256

现在,假设我想查询同样的内容,并且只获取客户端的 ID,但前提是不存在等于 '194' 的 t2.udf 值。所以,我会简单地得到

ID           
1234.9876    

...结果。

【问题讨论】:

【参考方案1】:

使联接成为 t2.Index 为空的左联接和文件管理器

SELECT t1.Id
FROM Table1 t1
LEFT JOIN Table2 t2 ON t1.Id = t2.Index
AND t2.UDF = 194   -- has to be before where clause
WHERE t2.Index IS NULL
AND t1.EndDate IS NULL 
AND t1.Id = '1234.9876'  -- not sure if you want this part

使用 NOT EXISTS 的另一种方式

SELECT t1.Id
FROM Table1 t1
WHERE NOT EXISTS (SELECT 1 FROM  Table2 t2 WHERE t1.Id = t2.INDEX
                AND t2.UDF = 194)
AND t1.EndDate IS NULL 
AND t1.Id = '1234.9876'  

另见JOINS

【讨论】:

+1 NOT EXISTS is by far the best 在几乎所有情况下。 @AaronBertrand 如果 Table2 在连接列上与 Table1 具有 FK 关系,并且该列是 Table2 上复合 PK 的一部分,那么左连接是否会命中? 这正是我所需要的。我以前使用过 LEFT JOIN,但从未以这种方式使用过。你每天都能学到新东西,对吧?非常非常感谢你。你是一个救生员。【参考方案2】:

您可以添加 AND t2.udf not in (select udf from table2 where udf '194')。 但是@SQLMenace 解决方案更好

【讨论】:

【参考方案3】:

应该这样做。

SELECT DISTINCT t1.Id 
FROM Table1 t1
LEFT JOIN Table2 t2 ON t1.Id = t2.Index
WHERE t2.UDF NOT IN (194)
AND t2.Index IS NULL

Select DISTINCT 为您提供满足其他条件的唯一条目,以及第一个 where 子句

  t2.UDF NOT IN (194)

Normall 将返回 t2.UDF 不是 194 的 t1 的所有行,但受 Select Distinct 限制,只能为您提供不同的 id

【讨论】:

【参考方案4】:

尝试以下方法:

SELECT t1.Id
FROM Table1 t1
JOIN Table2 t2 ON t1.Id = t2.Index
WHERE t1.EndDate IS NULL AND
      t1.Id = '1234.9876' AND
      t2.udf <> '194'

【讨论】:

以上是关于连接表中没有内容时的 SQL 选择的主要内容,如果未能解决你的问题,请参考以下文章

SQL如何选择表中不存在的记录?

MySQL - 从多个表中选择,可能没有连接?

从左连接SQL中选择时的COUNT(*)语法

sql [sql]从连接表中选择一个子行

如何从 SQL 表中选择特定行并连接 SQL 服务器中的多个表?

如何从SQL表中选择特定行并在SQL Server中连接多个表?