Mysql 选择提供完全相同零件的成对SID的查询:
我在MySQL中有以下关系:Mysql 选择提供完全相同零件的成对SID的查询:,mysql,sql,Mysql,Sql,我在MySQL中有以下关系: Suppliers(**sid**; sname; city), Parts(**pid**; pname; color), Catalog(**sid**; **pid**; cost), 钥匙在中间* 我想找到: 供应商对s1;s2,以便s1和s2提供完全相同的零件。 至少提供两个其他人不提供的零件的供应商。 1.供应商对s1;s2,以便s1和s2提供完全相同的零件: select c1.sid,c2.sid from catalog c1 join cata
Suppliers(**sid**; sname; city),
Parts(**pid**; pname; color),
Catalog(**sid**; **pid**; cost),
钥匙在中间*
我想找到:
供应商对s1;s2,以便s1和s2提供完全相同的零件。
至少提供两个其他人不提供的零件的供应商。
1.供应商对s1;s2,以便s1和s2提供完全相同的零件:
select c1.sid,c2.sid
from catalog c1 join catalog c2 on c1.pid = c2.pid and c1.sid < c2.sid
and not exists
(
select 1
from catalog c3 join catalog c4
on c3.sid = c1.id and c4.id = c2.sid
and c3.pid <> c4.pid
)
2.至少提供两个非其他人提供的零件的供应商
select c1.sid
from catalog c1 join catalog c2 on c1.sid = c2.sid and c1.pid < c2.pid
and not exists
(
select 1
from catalog
where sid <> c1.sid and (pid = c1.pid or pid = c2.pid)
)
我可以想象这样的事情会起作用。基本上,只要在不等于相同供应商和相同零件id的情况下进行左连接,然后查看连接数量是否等于未成功连接的行数。非常感谢您的回复。我自己写了以下查询,但我不确定它是否正确。请让我知道。谢谢 一, 选择T1.sid,T2.sid 从T1到T2 其中选择T1.sid,C2.pid
FROM( SELECT c1.pid
FROM Catalog C1
GROUP BY c1.sid) AS T1, Catalog C2
WHERE T1.sid=c2.sid)
=
二,
选择T1.S
从T1开始
如果不存在,选择c1.sid作为S,选择c1.pid作为p1,选择C2.pid作为p2
FROM catalog AS C1, Catalog as C2
WHERE c1.sid=c2.sid AND
C1.pid<>c2.pid) AS T1
EXCEPT
( SELECT c3.sid AS S1, c3.pid AS p3, C4.pid AS p4
FROM catalog AS C3, Catalog as C4
WHERE c3.sid=c4.sid AND
c3.pid<>c4.pid) AS T2)
不存在选择c3.sid作为S1,选择c3.pid作为p3,选择C4.pid作为p4
FROM catalog AS C3, Catalog as C4
WHERE c3.sid=c4.sid AND
c3.pid<>c4.pid) AS T2)
EXCEPT
(SELECT c1.sid AS S, c1.pid AS p1, C2.pid AS p2
FROM catalog AS C1, Catalog as C2
WHERE c1.sid=c2.sid AND
C1.pid<>c2.pid) AS T1
FROM catalog AS C1, Catalog as C2
WHERE c1.sid=c2.sid AND
C1.pid<>c2.pid) AS T1
EXCEPT
( SELECT c3.sid AS S1, c3.pid AS p3, C4.pid AS p4
FROM catalog AS C3, Catalog as C4
WHERE c3.sid=c4.sid AND
c3.pid<>c4.pid) AS T2)
FROM catalog AS C3, Catalog as C4
WHERE c3.sid=c4.sid AND
c3.pid<>c4.pid) AS T2)
EXCEPT
(SELECT c1.sid AS S, c1.pid AS p1, C2.pid AS p2
FROM catalog AS C1, Catalog as C2
WHERE c1.sid=c2.sid AND
C1.pid<>c2.pid) AS T1