2016-04-30 244 views
0

我對SQL查詢有一個小問題:我有'TableA'字段'TableA.b',其中包含'TableB'的ID。我想選擇'TableB'中沒有ID等於任何字段'TableA.b'的所有行。換句話說,我需要TableB中的每一行,這些行在TableA中的任何行都沒有引用。 我想這樣的查詢:MySQL - 選擇字段不相等的行

SELECT DISTINCT TableB.* FROM TableA, TableB Where TableA.b != TableB.ID 

但結果包含也被否定,即返回其中兩個字段具有相同值的行。 任何想法?

+0

提交的答案是否有幫助? – e4c5

回答

1

你需要的是LEFT (or RIGHT) JOIN

SELECT TableB.* FROM TableA 
    LEFT JOIN TableB on TableA.b = TableB.ID 
    WHERE TableA.b IS NULL 

儘管可以像子查詢一樣在某些otehr答案中執行相同的操作。加入經常是faster

左[外]連接可以比同等的子查詢更快,因爲 服務器可能能夠優化更好,事實上,本身並不是具體 到MySQL服務器。在SQL-92之前,外連接並不存在 ,所以子查詢是做某些事情的唯一方法。今天,MySQL服務器和許多其他現代數據庫系統提供了廣泛的外部連接類型 。

0

你可以試試這個

SELECT TableB.* FROM TableB 
    WHERE ID NOT IN 
     (SELECT b from TableA); 
0

首先,從TableA選擇所有ID:

SELECT DISTINCT b FROM TableA 

然後使用該結果在TableB選擇所有行有一個不存在的ID在此集合中,通過使用上述查詢作爲子查詢:

SELECT * FROM TableB WHERE ID NOT IN (SELECT DISTINCT b FROM TableA) 

希望這會有所幫助。

0

在SELECT查詢中使用NOT IN

SELECT * FROM TableB t1 WHERE t1.ID NOT IN (SELECT t2.b FROM TableA t2); 
+0

這可能是解決方案,但如果內部選擇結果包含空值,看起來像我得到一個空的結果。 – user1563232

+0

'@ user1563232'不可能。內部選擇給出空行或行數。 NULL在上面的查詢中是不可能的。 – Vijay

+0

如果你想要tableB的數據比不需要使用tableA進行內部或左連接。 – Vijay

0

你也可以使用正確的連接。 試試這個:

SELECT DISTINCT TableB.* FROM tablea RIGHT JOIN TableB ON TableA.b = Tableb.ID WHERE TableA.B IS NULL