讓我們通過這個邏輯。由於經驗不足,我的第一本能就是加入具有特定標準的產品。問題是,我想最終的多條記錄,所以我需要向下聚集的客戶:
Select c.CustomerId
From Customer c
Join Product p on p.CustomerId = c.CustomerId
Where p.ProductId in (2, 3, 4, 5)
or p.ProductId = 1
顯然,這是錯誤的,因爲最壞情況下它爲我們提供了5個記錄特定客戶的加盟最多5個匹配的產品。如果只有滿足BOTH條件才能獲得單個記錄,那麼我們必須考慮如何「查看記錄」。有以「看着對面的記錄」三種常用的方法:
子查詢,無論是在選擇,或在其中使用的東西像in
或exists
條款的標準,或者偶爾的嵌套連接。
聚合查詢。這有時需要一點創意和解決問題。
窗函數如MAX() OVER (PARTITION BY...)
可能與上面會CASE WHEN
條件語句相結合。
如果您瞭解了上述所有技巧,您將擁有更大的智力工具帶,以開始創造性地解決這些問題。這個答案有點寬泛,試圖展示所有這些的例子,所以我只展示一個解決你的問題的例子。
EXISTS子查詢
與EXISTS
檢查子查詢看到,如果任何記錄中找到至少一個記錄是從一個子查詢返回,而EXISTS
返回true。因爲結果沒有實際使用,我們只關心是否有至少一個記錄,不要緊什麼是子查詢的select
回來,所以我們只返回1
:
Select c.CustomerId
From Customer c
Join Product p on p.CustomerId = c.CustomerId
Where p.ProductId = 1
獨自以上返回不超過一條記錄,並且僅當客戶擁有ID = 1的相關產品時。下面添加附加條件以消除其中存在其中一個其他產品的至少一條記錄的記錄:
Select c.CustomerId
From Customer c
Join Product p on p.CustomerId = c.CustomerId
Where p.ProductId = 1
AND EXISTS
(Select 1 From Product p2
Where p2.ProductId in (2, 3, 4, 5)
AND p2.CustomerId = c.CustomerId)
這是最終的解決方案。請注意,我們只能在子查詢中查找相關記錄。爲了實現這一點,通常有一個或多個來自外部查詢的條件與內部查詢相匹配。在這種情況下,我們有來自外部查詢的c.CustomerID
和p2.CustomerId
來縮小內部查詢的結果。
更新了自聯接:
SELECT DISTINCT p1.CustomerId
FROM Products p1
JOIN Products p2 on p1.CustomerId = p2.CustomerId
WHERE p1.ProductId = 1
AND p2.ProductId in (2, 3, 4, 5)
聽起來像是你有錯地方了'USING'聲明。顯示你的嘗試? – AaronLS 2015-04-01 23:14:26
在上面的示例中添加了它 – 2015-04-01 23:28:48
該USING是MySQL語法,您需要遵循連接的TSQL語法:'FROM Production.Product AS p INNER JOIN Sales.SalesOrderDetail AS sod ON p.ProductID = sod.ProductID' – AaronLS 2015-04-01 23:30:48