以下是必要的信息。
表:Parts
:
pid, Color
表:Supplier
sid, sname
表:Catalog
pid, sid
我正在尝试在具有多个不同供应商的部分中找到pid。我真的不知道用什么命令来做这件事。 我知道我将不得不使用INNER JOIN连接零件和供应商,但是什么命令确保我只得到有多个不同供应商的pid?
如何找到没有供应商的零件?我知道DISTINCT或COUNT可以以某种方式使用但不确定这是如何工作的。
答案 0 :(得分:1)
查找超过1个供应商的零件:
SELECT
p.Color
,COUNT(DISTINCT s.sname) as nbrSupName
FROM
Parts p
INNER JOIN Catalog c
ON c.pid = p.pid
INNER JOIN Supplier s
ON s.sid = c.sid
GROUP BY
p.Color
HAVING
COUNT(DISTINCT s.sname) > 1
或者:
SELECT
p.Color
,s.sname
FROM
(SELECT
p.pid
,COUNT(DISTINCT s.sname) as nbrSupName
FROM
Parts p
INNER JOIN Catalog c
ON c.pid = p.pid
INNER JOIN Supplier s
ON s.sid = c.sid
GROUP BY
p.Color) subquery
INNER JOIN Catalog c
ON c.pid = subquery.pid
INNER JOIN Supplier s
ON s.sid = c.sid
GROUP BY
p.Color
,s.sname
WHERE
subquery.nbrSupName > 1
查找没有供应商的零件:
SELECT
p.Color
FROM
Parts p
LEFT JOIN Catalog c
ON c.pid = p.pid
WHERE
c.sid IS NULL
GROUP BY
p.Color
您还可以将第一个查询与COUNT(DISTINCT s.sname) = 0
答案 1 :(得分:0)
这应该有效:
select * from parts
where pid in
(select pid
from catalog
group by pid
having count(distinct sid) > 1)
由于您已经有一个将pid
映射到一个或多个sid
的表,您只需检索该表中具有多个sid
值的记录,并使用{{1实现此过滤器的子句。
对于没有HAVING
值映射到的pid
值,请执行sid
,如下所示:
left join
select * from
parts p
left join catalog c on p.pid = c.pid
where c.sid is null
检查确保仅检索is null
表中没有映射pid
的{{1}}个值。
答案 2 :(得分:0)
如果您只需要pid,则可以使用Catalog表
SELECT pid
FROM Catalog
GROUP BY pid
HAVING COUNT(sid) > 1
仅在供应商由sid而非名称识别时才有效。
让没有供应商的零件依赖于如何存储该信息
如果您的目录中的pid带有NULL
sid
SELECT pid
FROM Catalog
WHERE sid IS NULL
如果零件没有供应商,则目录中没有行
SELECT p.pid
FROM Parts p
LEFT JOIN Catalog c on p.pid = c.pid
WHERE c.pid IS NULL
如果您的数据库可以使用MINUS
类型命令,则可以执行此操作
SELECT pid
FROM Parts
MINUS --EXCEPT in SQLServer 2005+
SELECT pid
FROM Catalog