【问题标题】:Dealing with different tables in SQL Queries在 SQL 查询中处理不同的表
【发布时间】:2018-09-25 02:26:23
【问题描述】:

我是 SQL 新手,仍在学习如何编写查询。我对我编写的代码有一些疑问,主要是关于使用左连接/内连接

供应商(sid: int, sname: VARCHAR(30), 地址: VARCHAR(50))

零件(pid:int,pname:VARCHAR(30),颜色:VARCHAR(10))

目录(sid: int, pid: int, cost: double)

  1. 查找供应所有黑色零件的供应商的名字。

    select s.sid, s.sname from Suppliers s, Parts p
       where p.color = 'black'
       having count(p.pid) = 15;
    

我对这个查询的问题是,我是否需要在 where 子句中的任何地方都有 Suppliers 才能找到供应每个黑色零件的供应商?

  1. 列出所有供应黑色零件的供应商的名称。

     select s.sname from Suppliers s 
          inner join Parts p
          on p.color = 'black';
    

这也是同样的情况,我是使用正确的内连接还是在这个问题中我应该如何利用这两个表。

还有这两个问题,我是否需要使用目录,因为它可以将供应商和零件联系在​​一起?

【问题讨论】:

    标签: mysql sql mysql-workbench


    【解决方案1】:

    是的,您需要两个查询的目录,因为这是将您的供应商和产品联系在一起的共同点。

    我可能想多了。这是我的思路。

    结构

    create table suppliers (sid int, sname text, address text);
    create table parts (pid int, pname text, color text);
    create table catalog (sid int, pid int, cost int);
    
    insert into suppliers values (1, 'walmart', ''), (2, 'target', ''), (3, 'amazon', '');
    insert into parts values (1, 'ball', 'black'), (2, 'ball', 'white'), (3, 'bat', 'black'), (4, 'bat', 'white');
    insert into catalog (sid, pid) values (1, 1), (1, 2), (1, 3), (2, 1), (3, 2);
    

    选择所有黑色部分

    select group_concat(pid) as gc from parts p where p.color = 'black';
    
    gc
    ------
    1,3
    

    选择供应商出售的所有黑色零件

    select c.sid, group_concat(c.pid) as gc
    from catalog c inner join parts p on c.pid = p.pid and p.color = 'black'
    group by c.sid;
    
    sid   gc
    ----- ------
    1     1,3
    2     1
    

    寻找供应所有黑色零件的供应商

    select s.sname
    from (
        select c.sid, group_concat(c.pid) as gc
        from catalog c inner join parts p on c.pid = p.pid and p.color = 'black'
        group by c.sid
    ) a
    inner join (
        select group_concat(pid) as gc
        from parts p where p.color = 'black'
    ) b on a.gc = b.gc
    inner join suppliers s on a.sid = s.sid
    
    sname
    --------
    walmart
    

    与上述类似,您的第二个查询也必须更改为以下内容:

    第二次查询

    select distinct s.sname
    from catalog c
    inner join parts p on c.pid = p.pid and p.color = 'black'
    inner join suppliers s on c.sid = s.sid
    
    sname
    --------
    walmart
    target
    

    在上面的查询中,我们将目录与零件结合起来,得到所有有黑色零件的目录。然后我们将结果与供应商结合起来得到供应商的名称。如果供应商提供不止一个黑色部件,他们的信息可能会出现不止一次。因此,我们使用 distinct 来获得不同的名称。

    示例:http://rextester.com/IDH97131

    【讨论】:

      【解决方案2】:

      是的,假设数据插入正确,您的目录表是实现您要查询的内容的方法。如果没有目录,就无法将零件和供应商连接(或直接关联)在一起。

      我们以第二个颜色查询为例:(Suppliers表没有color列,所以该列不能用于join)

      SELECT s.name
        FROM Suppliers s
          INNER JOIN Catalog c ON s.sid = c.sid
          INNER JOIN Parts   p ON c.pid = p.pid
       WHERE p.color = 'black';
      

      应该这样做,但如果没有,请将您的表模式附加到问题中。您可以通过SHOW CREATE TABLE Catalog 获取此信息,然后复制/粘贴输出。然后对其他 2 个表执行相同操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-20
        • 2016-03-18
        • 1970-01-01
        • 2018-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多