2016-05-02 32 views
1

我需要幫助的查詢權結構搞清楚,以結構NOT IN/NOT EXISTS(?)三個用表

找到這些客戶,誰在完全相同的停止的名字 酒店爲John Doe。

我有表:

客戶(clientID的,CLIENTNAME)

ClientTour(clientID的,tourID)

旅遊(tourID,國家,酒店)

這一切應該寫下來作爲一個查詢。

我是很新的SQL,不能寫下正確的子查詢它,因爲它使用三個表......我有所瞭解如何編寫類似查詢的兩個表,但是當我試着寫這一個...好吧,我迷路了。 =/

據我瞭解,我必須要找到這些客戶, 誰在

停止的名字[點擊查看其中李四停止] - [酒店只有李四停止]

但誰從來沒有在這些

[酒店,其中李四從未停止]停止。

它在邏輯上是正確的嗎?如果是的話,我得到的是

SELECT c1.clientName

來自客戶端C1

WHERE c1.clientID NOT IN(在[酒店的客戶的ClientID而約翰 Doe的一部分從來沒有停止過]

和c1.clientID IN(在[[點擊查看了約翰 李四停止]客戶的clientId - [酒店只有李四停止]

,但無法弄清楚標楷體部分......我怎麼找到誰在賓館,李四做了停止/沒有停止客戶端,或只李四停止了酒店?

此外,有沒有寫這個查詢下任何更簡單的方法?

+0

這實際上是新的人到SQL一個非常棘手的問題! –

+0

*酒店*由* tourID *唯一確定,或者*酒店*可以列入* Tours *的多個記錄中? – trincot

+0

@trincot,如果_hotel_由_tourID_唯一確定,則不指定。我想它可以多次列出。 – 0lesya

回答

1

編輯:
1.加入外層SELECT GROUP BY子句,更換需要DISTINCT,並加入countnig的酒店結果中的每一客戶端設置的選項。請注意,結果集中只有'John Doe'參加過的酒店。
2.增加了一條SELECT語句來計算賓館'John Doe'曾經訪問過的酒店的數量。
3.增加了一個HAVING子句,用於消除與「John Doe」不同的酒店數量的結果集客戶。

SELECT C.clientName 
FROM (Clients AS C INNER JOIN ClientTour AS CT ON C.clientID = CT.clientID) INNER JOIN Tours AS T ON CT.tourID = T.tourID 
WHERE C.clientName <> 'John Doe' 
    AND T.hotel IN 
(
    SELECT DISTINCT T1.hotel 
    FROM (Clients AS C1 INNER JOIN ClientTour AS CT1 ON C1.clientID = CT1.clientID) INNER JOIN Tours AS T1 ON CT1.tourID = T1.tourID 
    WHERE C1.clientName = 'John Doe' 
) 
GROUP BY C.clientName 
HAVING COUNT(DISTINKT T.hotel) = SELECT COUNT(DISTINCT T2.hotel) 
    FROM (Clients AS C2 INNER JOIN ClientTour AS CT2 ON C2.clientID = CT2.clientID) INNER JOIN Tours AS T2 ON CT2.tourID = T2.tourID 
    WHERE C2.clientName = 'John Doe' 

首先atempt:

SELECT C.clientName 
FROM (Clients AS C INNER JOIN ClientTour AS CT ON C.clientID = CT.clientID) INNER JOIN Tours AS T ON CT.tourID = T.tourID 
WHERE Trim(C.clientName) <> 'John Doe' 
    AND T.hotel IN 
(
    SELECT DISTINCT T1.hotel 
    FROM (Clients AS C1 INNER JOIN ClientTour AS CT1 ON C1.clientID = CT1.clientID) INNER JOIN Tours AS T1 ON CT1.tourID = T1.tourID 
    WHERE Trim(C1.clientName) = 'John Doe' 
) 
+1

如果在_clientName_值之前或之後沒有空格,我可以只使用_C.clientName_而不是_Trim(C.clientName)_?另外,我認爲在第一次SELECT之後添加DISTINCT是一個好主意,以避免重複名稱... – 0lesya

+0

是的,是的:) – marlan

+0

它發現停留在與John Doe相同的酒店的客戶,但不是_exactly_ 。它不應該顯示客戶,他們也停在John Doe沒有的酒店裏。你上面寫的查詢確實如此。 – 0lesya