您好我認爲兩個標準選擇我俯瞰一個問題我一直在使用SQL DB2。我有兩列 - 人和車。我想找到購買邁凱輪和法拉利的人。DB2:在同一列
我做:
select distinct person,car from car_db
where car = 'ferrari' and car = 'mclaren'
然而這回沒有人,即使目測的數據,還有一些已經買了兩個人。必須有辦法挑選那些同時購買這兩種產品的人。任何想法?
您好我認爲兩個標準選擇我俯瞰一個問題我一直在使用SQL DB2。我有兩列 - 人和車。我想找到購買邁凱輪和法拉利的人。DB2:在同一列
我做:
select distinct person,car from car_db
where car = 'ferrari' and car = 'mclaren'
然而這回沒有人,即使目測的數據,還有一些已經買了兩個人。必須有辦法挑選那些同時購買這兩種產品的人。任何想法?
有幾種方法。
一個簡單的辦法是選擇一套誰購買了一臺車人,並使用一個內連接來與它們匹配起來反對誰購買另一輛車一組的人。
WITH F AS
(SELECT DISTINCT PERSON
FROM CAR_PURCHASES
WHERE CAR = 'FERRARI'
), M AS
(SELECT DISTINCT PERSON
FROM CAR_PURCHASES
WHERE CAR ='MCLAREN'
)
SELECT F.PERSON
FROM F JOIN M ON f.person = m.person
另一種可能是使用分組
WITH Q AS
(SELECT PERSON,
MAX(CASE WHEN CAR='FERRARI' THEN 1 ELSE 0 END) AS BOUGHT_FERRARI,
MAX(CASE WHEN CAR='MCLAREN' THEN 1 ELSE 0 END) AS BOUGHT_MCLAREN
FROM CAR_PURCHASES
GROUP BY PERSON
)
SELECT PERSON
FROM Q
WHERE BOUGHT_FERRARI > 0
AND BOUGHT_MCLAREN > 0
ORDER BY PERSON
還有很多其他的方法,但現在你有一些想法如何做到這一點。
怎麼樣美好的舊內加入?如果有人購買2輛法拉利或2輛邁凱輪,則需要使用獨特設計。
select distinct F.PERSON
from CAR_PURCHASES F inner join CAR_PURCHASES M on F.PERSON = M.PERSON
where F.CAR = 'FERRARI'
and M.CAR = 'MCLAREN'
這個問題是量身定做的INTERSECT
運營商,並是簡單得多的讀/理解,比採用JOIN
解決方案。
它的基本集理論:
select person from car_db where car = 'FERRARI'
INTERSECT
select person from car_db where car = 'MCLAREN'
INTERSECT
將自動刪除任何重複。如果您想要複製person
記錄,則可以使用INTERSECT ALL
。
注意,你可以使用EXCEPT
運營商找到誰擁有法拉利,但沒有自己的邁凱輪人:
select person from car_db where car = 'FERRARI'
EXCEPT
select person from car_db where car = 'MCLAREN'
+1還不知道'intersect'操作符。 –
謝謝伊恩 - 不知道這件事。 – brucezepplin
我用你的第一個版本,併爲我工作。 – brucezepplin