2014-02-20 42 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