连接表中没有内容时的 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
【讨论】:
+1NOT 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 选择的主要内容,如果未能解决你的问题,请参考以下文章