2014-02-20 75 views
1

所以我有三個表:Select語句,每個字段包含多個值

廠商 風格 vendor_styles

一個供應商可以有很多風格。因此,對於給定的供應商ID,vendor_styles中可以有多行。

我想要做的是給一個供應商,我想找到所有的供應商,與樣式沒有任何重疊。因此,如果我擁有的供應商是攝影師和攝影師,我想找到所有不是攝影師而不是攝影師的供應商。現在發生的情況是,在這種情況下,如果供應商是供應商,攝影師和dj,那麼它將得到回報,因爲它與第一個供應商比較時有一種不存在的風格。但是我想確定是否有任何樣式是相同的,它不會被返回。

我跑的select語句是:

select * 
from vendors, vendor_styles 
where vendors.id = vendor_styles.vendor_id 
    and vendor_styles.style_id not in 
    (select style_id from vendor_styles where vendor_id = <vendor_id>); 

的問題是,它基本上可以歸結爲

(23,25) not in (22, 23, 25) 

因爲22是不是在前者的情況是真實的。我試圖得到的是,如果第一組值中的任何值都在第二組值中,則條件爲假。

+0

也許使用INTERSECT或EXCEPT和計數(你正在尋找交叉點是零元素)[EXCEPT和INTERSECT(Transact-SQL)](http://technet.microsoft.com/en-us/library /ms188055.aspx) – Anssssss

回答

0

此查詢應該返回正確的結果:

SELECT v.* 
FROM 
    vendors v 
WHERE 
    NOT EXISTS (
    SELECT * 
    FROM vendor_styles vs1 INNER JOIN vendor_styles vs2 
     ON vs1.style_id = vs2.style_id 
      AND vs1.vendor_id = 1 --- insert vendor id here 
    WHERE 
     vs2.vendor_id = v.id) 

請參閱小提琴here

+0

工程就像一個魅力。謝謝! – user3334326