【问题标题】:Selecting multiple names with different field SQL选择具有不同字段 SQL 的多个名称
【发布时间】:2018-07-15 04:26:17
【问题描述】:

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

我的作业问题是找到不供应饮料的供应商。

使用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 'Beverage' 的她的名字,而忽略了她的其他对应部分。 Output table 如您所见,供应商“Anne Heikkonen”仍然出现在结果中,因为她既提供饮料又提供其他服务。

Product Table

Categories Table

Supplier Table

【问题讨论】:

标签: sql sql-server join


【解决方案1】:

使用类似的东西

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)

【讨论】:

    【解决方案2】:

    虽然我喜欢 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
    

    【讨论】:

      猜你喜欢
      • 2020-12-20
      • 1970-01-01
      • 2017-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多