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

1 t-sql join left-join outer-join sql-server-2008

好.我在一个表中有一些数据,它多次引用另一个表中的一些数据.

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

假设我有一个查询,显示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
Run Code Online (Sandbox Code Playgroud)

我会得到以下结果......

ID            UDF
1234.9876     100
1234.9876     110
1234.9876     118
1234.9876     124
1234.9876     198
1234.9876     256
Run Code Online (Sandbox Code Playgroud)

现在,假设我想查询同样的事情,并且只获取客户端的ID,但仅限于t2.udf等于'194'的值不存在.所以,我只是得到

ID           
1234.9876    
Run Code Online (Sandbox Code Playgroud)

...结果是.

SQL*_*ace 5

使连接成为LEFT连接和文件管理器,其中t2.Index为null

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
Run Code Online (Sandbox Code Playgroud)

另一种使用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'  
Run Code Online (Sandbox Code Playgroud)

另见JOINS

  • 在几乎所有情况下,+1 [`NOT EXISTS`是迄今为止最好的](http://www.sqlperformance.com/2012/12/t-sql-queries/left-anti-semi-join). (2认同)