所以我有三张桌子:
供应商 款式 vendor_styles
供应商可以有很多样式。因此,对于给定的供应商ID,vendor_styles中可以有多行。
我想要做的是给一个供应商,我想找到所有与样式没有任何重叠的供应商。因此,如果我拥有的供应商是摄影师和摄像师,我想找到所有不是摄影师而不是摄像师的供应商。现在发生的事情是,鉴于这种情况,如果供应商是供应商,摄影师和dj,它将被返回,因为它与第一个供应商进行比较时有一种不存在的风格。但我想确保如果任何样式与未返回的样式相同。
我跑的选择语句是:
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 :(得分: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。