2013-10-24 41 views
0

您好我認爲兩個標準選擇我俯瞰一個問題我一直在使用SQL DB2。我有兩列 - 人和車。我想找到購買邁凱輪和法拉利的人。DB2:在同一列

我做:

select distinct person,car from car_db 
where car = 'ferrari' and car = 'mclaren' 

然而這回沒有人,即使目測的數據,還有一些已經買了兩個人。必須有辦法挑選那些同時購買這兩種產品的人。任何想法?

回答

1

有幾種方法。

一個簡單的辦法是選擇一套誰購買了一臺車人,並使用一個內連接來與它們匹配起來反對誰購買另一輛車一組的人。

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 

還有很多其他的方法,但現在你有一些想法如何做到這一點。

+0

我用你的第一個版本,併爲我工作。 – brucezepplin

1

怎麼樣美好的舊內加入?如果有人購買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' 
3

這個問題是量身定做的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' 
+0

+1還不知道'intersect'操作符。 –

+0

謝謝伊恩 - 不知道這件事。 – brucezepplin