2017-02-21 114 views
3

我不敢相信我是第一個問過這個問題的人,但是我無法找到正確的方法來實現以下查詢。 從邏輯上講,它似乎很簡單,但我很努力地編碼它選擇一個表中的所有列表與另一個列表中的某個匹配

我有2個表,我想從表1中獲取所有的汽車和cust_id,其中表2的顏色完整列表(分組車)從表1的顏色相匹配 的癥結是,並非所有的表1的顏色必須在表2

我一直在嘗試連接,並存在交叉,但無濟於事 所有如果至少有一個項目匹配,但下面的代碼類似,但不是全部匹配。

SELECT 
a.Cust_Id, 
a.Car 
FROM Table1 a 
JOIN Table2 b ON a.Car = b.Car and a.Colour = b.Colour 
GROUP BY a.Cust_Id, a.Car 

這是一個更大的腳本做很多其他的事情的一部分,所以我用的車/顏色作爲一個例子,所以欣賞它並沒有多大意義,在這方面。

表1

enter image description here

表2

enter image description here

期望輸出

Output 
1 Audi 
1 Ford 
2 VW 
+0

添加了表格示例和預期輸出。 – gregdanish

+0

@TimBiegeleisen,回答是,但不在OP的查詢中。 – jarlh

回答

4

對於每個組,從計數的NULL顏色數並確保此計數爲零。這意味着第二個表格中的每種顏色都映射到第一個表格中的一種顏色。

SELECT b.Cust_Id, 
     b.Car 
FROM Table1 a 
RIGHT JOIN 
(
    SELECT 1 AS Cust_ID, Car, Colour 
    FROM Table2 
    UNION ALL 
    SELECT 2, Car, Colour 
    FROM Table2 
) b 
    ON a.Car = b.Car  AND 
     a.Colour = b.Colour AND 
     a.Cust_ID = b.Cust_ID 
GROUP BY b.Cust_Id, 
     b.Car 
HAVING SUM(CASE WHEN a.Colour IS NULL THEN 1 ELSE 0 END) = 0 

請注意,我使用子查詢來增強第二個顏色要求表。我添加了一個Cust_ID列,假設每個客戶都有相同的要求,以便使聯接更容易處理和分析。

+0

謝謝蒂姆,我同意你的邏輯,雖然這個輸出爲我提供了福特和大衆的顧客1和奧迪和大衆的顧客2,因爲它匹配的事實1項目存在於表2中,而不是全部。 – gregdanish

+0

你想讓每輛車都擁有第二張表中的顏色嗎? –

+0

是的,只有當所有顏色都在table2中時,纔會顯示table1中的所有記錄。因此奧迪和福特將展示cust_id 1,因爲兩種顏色都在表2中。但對於VW Table1必須有藍色和黑色 – gregdanish

0

認爲我已經解決了它,稍微修改了RIGHT JOIN標準,似乎與我運行的測試一起工作。

SELECT b.Cust_Id, 
     b.Car 
FROM Table1 a 
RIGHT JOIN 
(
    SELECT b.Cust_ID, a.Car, a.Colour 
    FROM Table2 a, Table1 b 
    ) b 
    ON a.Car = b.Car  AND 
     a.Colour = b.Colour AND 
     a.Cust_ID = b.Cust_ID 
GROUP BY b.Cust_Id, 
     b.Car 
HAVING SUM(CASE WHEN a.Colour IS NULL THEN 1 ELSE 0 END) = 0 
1

有點晚這是我看你已經有了一個解決方案,但這裏的一些SQL我的情況下,來到了這可能是有些用處的。我讀到這個問題的方式,table1可能是來自不同客戶的汽車的願望清單,table2是汽車經銷商可以提供的清單。經銷商想要知道哪些客戶對每輛車的全系列顏色感興趣:

select w.cust_id, w.car 
from table1 w join table2 s 
    on w.car=s.car and w.colour=s.colour 
group by w.cust_id, w.car 
having count(s.car)=(select count(*) from table2 where car=w.car); 
+0

謝謝。也似乎工作。 :) – gregdanish

相關問題