2017-05-30 88 views
0

爲了簡單起見,查找的行,假設我有一個包含客戶表和產品,他們持有像這樣:在多個標準會見了多對多的關係

Client_ID  Product_Held 
    1   Product1 
    1   Product2 
    1   Product3 
    2   Product1 
    2   Product2 
    3   Product1 
    3   Product1 

客戶可以容納任何產品的組合,以及同一產品的倍數。

我希望能夠到我的查詢限制爲僅保持產品1和產品2的所有客戶端,我也有找出所需的邏輯有點困難。如果我這樣做與產品1和產品2的所有客戶端的搜索,我的結果將包括那些誰持有產品1只,以及那些誰只持有產品2。

在過去,我只是將結果轉儲到Excel中,添加一個結合兩個字段(即1Product1,1Product2)的列,然後編寫一個基本上說1Product1存在且1Product2存在的快速公式,然後標記爲好的,並過濾掉其他所有內容,但推測它應該是相當簡單的,而不是通過我的查詢來完成。

我覺得我應該是這樣:

WHERE Client_ID exists in Client_ID + Product_Held AND Product_Held = 'Product1' 
AND Client_ID exists in Client_ID + Product_Held AND Product_Held = 'Product2' 

但有麻煩的語法,還不能確定這是否是一個有效的方法是什麼?

回答

0

您可以通過聚集和having做到這一點:

select client_id 
from t 
group by client_id 
having sum(case when product_held = 'Product1' then 1 else 0 end) > 0 and 
     sum(case when product_held = 'Product2' then 1 else 0 end) > 0 and 
     sum(case when product_held in ('Product1', 'Product2') then 1 else 0 end) = count(*); 

這是什麼做的?前兩個條件是計算每個產品爲每個客戶顯示的次數。 > 0意味着至少有一個。

最後一個條件檢查,這兩個產品的數量相匹配的所有行。這保證所有產品都是這兩種產品。您也可以表達爲:

 sum(case when product_held not in ('Product1', 'Product2') then 1 else 0 end) = 0; 
+0

謝謝,這個工作完美。儘管我在集體聲明中遇到了一些麻煩。爲了簡單起見,我將它表示爲一個表格,但實際上它是幾個帶連接的表格,只有在我的select語句中包含每個字段時,該語句纔會有效,在我的group by語句中也是這樣,即:SELECT Field 1, Field2,Field3,GROUP BY Field1,Field2,Field3。 我仍然在學習SQL,GROUP BY語句總是必須包含select語句中的每個字段? – Dekks

+0

我結束了運行這個作爲子查詢,然後讓我的主要查詢說在哪裏client_id在(與子句查詢)。不知道它是否是最有效的方式,但這是另一天的問題! – Dekks