2013-03-25 49 views
1

好的。我在一個表中有一些數據,多次引用另一個表中的一些數據。SQL選擇何時不在連接表中

表1 - 主客戶機表 表2 - 用戶定義的字段

說我有一個查詢,示出了從表1和所有連接/使用的「用過定義的字段」從表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我會得到下面的結果...

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

現在,說我想查詢同樣的事情,並得到客戶的唯一標識,但在LY如果t2.udf等於'194'的值不存在。所以,我會簡單地得到

ID   
1234.9876  

...因此。

回答

5

使連接左連接和文件管理器,其中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

+2

幾乎在所有情況下,+1 ['NOT EXISTS'都是最好的](http://www.sqlperformance.com/2012/12/t-sql-queries/left-anti-semi-join)。 – 2013-03-25 20:44:56

+0

@AaronBertrand如果Table2在連接列上與Table1有FK關係,並且該列是Table2上的一個組合PK的一部分,那麼是否有左連接命中? – Paparazzi 2013-03-25 21:11:39

+0

這完全是我所需要的。我之前使用過LEFT JOIN,但從來沒有這種方式。你每天都會學到新的東西,嗯?非常非常感謝你。你是一個拯救生命的人。 – user2208914 2013-03-26 12:41:59

0

您可以添加和T2 .udf不在(從表2選擇udf,其中udf <>'194')。 但@SQLMenace解決方案更好

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 

SELECT DISTINCT爲您提供了滿足其他條件的唯一條目,和第一where子句

t2.UDF NOT IN (194) 

Normall將返回所有行的T1在t2.UDF不是194,而是它是由SELECT DISTINCT限於給你只不同ID的

-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'