在sql查询中处理不同的表

bakd9h0s  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(346)

我是sql新手,仍在学习如何编写查询。。我有一些关于我写的代码的问题,这些代码主要考虑使用左连接/内连接
供应商(sid:int,sname:varchar(30),地址:varchar(50))
零件(pid:int,pname:varchar(30),颜色:varchar(10))
目录(sid:int,pid:int,cost:double)
找出供应每一个黑色零件的供应商的陷阱。

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

对于这个查询,我的问题是,我是否需要在where子句中的任何地方有供应商,以便找到供应每个黑色部件的供应商?
列出所有供应黑色零件的供应商的名单。

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

这也是同样的情况,在这个问题中,我是正确地使用内部联接还是应该如何使用这两个表。
还有这两个问题,我是否需要使用目录,因为这是什么可以联系在一起的供应商和零件?

hzbexzde

hzbexzde1#

是的,假设数据插入正确,您的目录表就是实现您要查询的内容的方法。在没有目录的情况下,零件和供应商之间没有任何联系。
让我们以第二个颜色查询为例:(suppliers表没有 color 列,因此列不能用于联接)

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 然后复制/粘贴输出。然后对其他两个表执行相同的操作。

u0njafvf

u0njafvf2#

是的,这两个查询都需要目录,因为这是连接供应商和产品的共同点。
我可能想得太多了。这是我的思路。
结构

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

在上面的查询中,我们将catalog与parts结合起来,得到所有包含黑色部分的catalog。然后将结果与供应商相结合,得到供应商的名称。如果供应商提供多个黑色零件,则其信息可能出现多次。所以,我们使用distinct来获得不同的名称。
例子:http://rextester.com/idh97131

相关问题