2011-08-05 35 views
4

我真的可以使用一些幫助,下面的SQL SELECT語句的情景:SQL SELECT語句的問題 - 在第2表返回行有條件

我需要從表中有條件地依賴於用戶ID是否已經選擇所有的行將數據輸入到具有相同ID的第二個表中。

實施例:

a)選擇從IDNumber中表A,其中的ID號不是在表B b)中,但對於在表B IS每個的ID號,仍然返回行除非特定用戶ID是在該行中的所有行表B.

TABLE A 
======== 
idNumber|type|Date 

    1  A 01/01/01 

    2  A 01/01/01 

    3  B 01/01/01 

    4  B 01/01/01 

    5  B 01/01/01 

TABLE B 
======== 
idNumber|type|userID 
    1  A 0000 

    3  B 0000 

    4  B 1111 

用戶ID爲排除= 1111記錄

SQL查詢應該返回:

idNumber|type|Date 

    1  A 01/01/01 

    2  A 01/01/01 

    3  B 01/01/01 

    5  B 01/01/01 

道歉的冗長的帖子,但我希望它是有道理的。

非常感謝, ukjezza。!!

+0

這是用於SQL Server? –

回答

3
Select idNumber, type, Date 
From TableA 
Where Not Exists (
        Select 1 
        From TableB 
        Where TableB.idNumber = TableA.idNumber 
         And TableB.userID = 1111 
        ) 

另一種選擇:

Select TableA.idNumber, TableA.type, TableA.Date 
From TableA 
    Left Join TableB 
     On TableB.idNumber = TableA.idNumber 
      And TableB.userId = 1111 
Where TableB.idNumber Is Null 
+0

你知道這與使用'JOIN'的性能相比嗎? –

+0

@Abe Miessler - 取決於數據庫和數據的性質。如果TableB與TableA相比ginormous,則Exists子句將執行得更好(再次,取決於db)。如果兩個表大小相同,那麼聯接可能會更好。我注意到SQL Server處理Exists函數比說MySQL更好。 MySQL需要一個In子句而不是Exists函數。 – Thomas

3

貌似LEFT JOINCOALESCE可以照顧它:

SELECT a.* 
FROM TableA as a 
LEFT JOIN TableB as b 
ON a.idNumber = b.idNumber 
WHERE COALESCE(b.userID, -1) != 1111 
1
select A.* 
from TableA as A 
    left outer join TableB as B 
    on A.idNumber = B.idNumber 
where B.idNumber is null or 
     B.userID <> '1111' 
+0

非常感謝大家,我現在有了一個解決方案,並且我學習了許多有條件選擇數據的新方法。 其實我有去: 選擇的ID號,類型, DateFrom TableAWhere NOT EXISTS (選擇1從表B 其中TableB.idNumber = bleA.idNumber 而TableB.userID = 1111) 再次感謝!!!! – ukjezza