我認爲這將是一個簡單的查詢寫法,但實現起來比我第一次想到的要困難得多。如何從連接表中的列中排除其他值SQL
任何幫助,將不勝感激 - 它的駕駛我逼瘋了:)
我有兩個表,一個用戶第二;採購產品。用戶可以在產品表中有多個產品。
我有一個加入的查詢,我返回一個具有特定產品的用戶列表 - 迄今爲止這麼好。
現在,這裏的問題:
我想排除有其他特定產品的用戶。
因此,只返回具有產品1001的用戶,而不是在產品表中具有產品1001和1002的用戶。
我認爲這將是一個簡單的查詢寫法,但實現起來比我第一次想到的要困難得多。如何從連接表中的列中排除其他值SQL
任何幫助,將不勝感激 - 它的駕駛我逼瘋了:)
我有兩個表,一個用戶第二;採購產品。用戶可以在產品表中有多個產品。
我有一個加入的查詢,我返回一個具有特定產品的用戶列表 - 迄今爲止這麼好。
現在,這裏的問題:
我想排除有其他特定產品的用戶。
因此,只返回具有產品1001的用戶,而不是在產品表中具有產品1001和1002的用戶。
稍微不同的方法:
SELECT u.user_id
FROM users u
JOIN purchased_products p
ON u.user_id = p.user_id AND
p.product_id in (1001, 1002)
GROUP BY u.user_id
HAVING COUNT(DISTINCT p.product_id) = 1 AND
MIN(p.product_id) = 1001
SELECT u.*
FROM users u
INNER JOIN purchased_products p
ON u.user_id = p.user_id
AND p.product_id = 1001
WHERE NOT EXISTS(SELECT 1
FROM purchased_products p2
WHERE p2.product_id = 1002
AND p2.user_id = u.user_id)
這適用於預期的結果,但速度很慢。我查詢的表格非常龐大,用戶表格超過了800K行,而產品表格大約是。 300K。然而,在這種情況下,性能並不重要,因爲我只需要運行偶爾的報告。非常感謝您的貢獻。 – Carl 2012-02-29 17:01:38
SELECT * from `user`
LEFT JOIN `product` on `user`.`id` = `product`.`user_id`
WHERE `product`.`id` = <w1st_product_id>
AND `user`.`id` NOT IN (
SELECT user_id
FROM product
WHERE product.id = <2nd_product_id>
)
反引號是特定於MySQL的 - 操作系統正在使用SQLServer。 – 2012-02-29 14:45:43
此解決方案也適用於SQL服務器 - 一旦反引號刪除:)謝謝! – Carl 2012-02-29 17:49:06
SELECT * from user U
where (select count(*) from product P where P.user_id=U.user_id)=1
我需要指定產品ID,但謝謝。 – Carl 2012-02-29 17:04:05
只返回有產品1001有兩種產品在產品表1001和1002,而不是用戶的用戶。
如果您使用SQL Server 2005或更高版本,可以使用
SELECT U.Id
FROM [User] U INNER JOIN Product P ON U.Id = P.UserId AND P.ProductId = 1001
EXCEPT
SELECT U.Id
FROM [User] U INNER JOIN Product P ON U.Id = P.UserId AND P.ProductId = 1002
,正如單詞「EXCEPT
」建議,將返回IDS對具有產品1002,除非用戶他們也有產品1002.
在這個例子中,我們使用的是2000.但是你的回答對知道非常有用,謝謝。 – Carl 2012-02-29 15:39:52
該解決方案也按預期工作,並且在SQL服務器中表現良好。如果性能是重中之重,我會說這是正確的解決方案。非常感謝馬克。 – Carl 2012-02-29 17:06:26