当某些东西不在连接表中时,SQL选择

时间:2013-03-25 20:21:53

标签: sql-server-2008 tsql join left-join outer-join

确定。我在一个表中有一些数据,它多次引用另一个表中的一些数据。

表1 - 主客户端表 表2 - 用户定义的字段

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

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,但只有在t2.udf等于'194'的值不存在时才会出现。所以,我只想得到

ID           
1234.9876    

......结果。

4 个答案:

答案 0 :(得分:5)

使连接成为LEFT连接和文件管理器,其中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 :(得分:0)

您可以添加AND t2.udf(从表2中选择udf,其中udf<>'194')。 但@SQLMenace解决方案更好

答案 2 :(得分:0)

这应该这样做。

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

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

  t2.UDF NOT IN (194)

Normall会返回t2.UTF不是194的t1的所有行,但是它受Select Distinct的限制只能为你提供不同的id

答案 3 :(得分:-1)

尝试以下方法:

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'