选择具有不同字段SQL的多个名称

时间:2018-07-14 04:11:44

标签: sql sql-server join

我是SQL语言的新手。刚学了四个月。

我的分配问题是找到不提供饮料的供应商。

使用LEFT OUTER JOINRIGHT OUTER JOIN(也可以使用INNER JOIN)。

我得到了3张桌子。

SELECT 
    S.ContactName    
FROM 
    Suppliers AS S    
INNER JOIN    
    Products AS P ON S.SupplierID = P.SupplierID    
LEFT OUTER JOIN    
    Categories AS C ON C.CategoryID = P.CategoryID    
WHERE 
    C.CategoryName != 'Beverages'    
GROUP BY 
    S.ContactName    

我尝试使用上面的代码,但似乎返回多个名称。例如,供应商“ Anne Heikkonen”同时提供饮料和其他饮料。但是当我使用上面的select语句时,它只删除了具有CategoryName'饮料'的她的名字,而忽略了她的其他对应部分。 Output table如您所见,供应商“ Anne Heikkonen”仍在结果中显示,因为她同时提供饮料和其他饮料。

Product Table

Categories Table

Supplier Table

2 个答案:

答案 0 :(得分:0)

使用类似

select s.name
 from supplier
where not exists (select 1 
                    from product p
                    join category c on c.category_id = p.category_id
                   where c.category_name = 'Beverages'
                     and p.supplier_id = s.supplier_id)

答案 1 :(得分:0)

尽管我喜欢not exists方法,但是让您的工作方法值得。

想法是:获取所有供应商并使用left join来匹配饮料类别。然后使用where子句查看是否存在匹配项。

所以看起来像这样:

SELECT S.ContactName    
FROM Suppliers S LEFT JOIN    
     Products P
     ON S.SupplierID = P.SupplierID LEFT JOIN    
     Categories C
     ON C.CategoryID = P.CategoryID AND   
        C.CategoryName = 'Beverages'  -- attempt the match
WHERE C.CategoryId IS NULL;  -- find there is no match