Nic*_*ner 8 mysql sql intersect
这是我的查询:
-- Sids of suppliers who supply a green part AND a red part
(SELECT Suppliers.sid
FROM Suppliers
JOIN Catalog ON Catalog.sid = Suppliers.sid
JOIN Parts ON Parts.pid = Catalog.pid
WHERE Parts.color = "red")
INTERSECT
(SELECT Suppliers.sid
FROM Suppliers
JOIN Catalog ON Catalog.sid = Suppliers.sid
JOIN Parts ON Parts.pid = Catalog.pid
WHERE Parts.color = "green");
Run Code Online (Sandbox Code Playgroud)
这是错误:
错误1064(42000):您的SQL语法有错误; 检查与MySQL服务器版本对应的手册,以便在第6行的"INTERSECT(SELECT Suppliers.sid FROM Suppliers JOIN Catalog ON Catalog.sid = Sup")附近使用正确的语法.
我究竟做错了什么?
这是架构:
供应商(sid:整数,sname:字符串,地址字符串)
零件(pid:整数,pname:字符串,颜色:字符串)
目录(sid:整数,pid:整数,成本:实际)
bold =主键
Rol*_*man 11
您似乎使用的MySQL不支持INTERSECT语法.你将不得不以另一种方式解决它.
在这种情况下,它是微不足道的 - 我们只需要提供某些部分提供"绿色"和"红色"的所有供应商的列表 - 您的查询无需查看部件本身是否相关,因此我们可以很容易地解决它像这样:
SELECT Suppliers.sid
FROM Suppliers
JOIN Catalog ON Catalog.sid = Suppliers.sid
JOIN Parts ON Parts.pid = Catalog.pid
WHERE Parts.color IN ('red', 'green')
GROUP BY Suppliers.sid
HAVING COUNT(DISTINCT Parts.color) = 2
Run Code Online (Sandbox Code Playgroud)
就个人而言,我不相信原始查询是一个典型的INTERSECT问题.看一看JOINVinko Vrsalovic提供的解决方案来提供一个通用的解决方案来模拟INTERSECT(即使RDBMS实际上提供INTERSECT本机,我也会更喜欢).
没什么,MySQL 没有 INTERSECT 关键字。您可以将其重写为 INNER JOIN:
SELECT DISTINCT sid FROM
(SELECT Suppliers.sid
FROM Suppliers
JOIN Catalog ON Catalog.sid = Suppliers.sid
JOIN Parts ON Parts.pid = Catalog.pid
WHERE Parts.color = "red") a
INNER JOIN
(SELECT Suppliers.sid
FROM Suppliers
JOIN Catalog ON Catalog.sid = Suppliers.sid
JOIN Parts ON Parts.pid = Catalog.pid
WHERE Parts.color = "green") b
ON (a.sid = b.sid);
Run Code Online (Sandbox Code Playgroud)
这个查询肯定可以写得更好,但这是为了表明 intersect 只是一个带有 select distinct 的内部连接,您可以自动将一个转换为另一个。
| 归档时间: |
|
| 查看次数: |
17752 次 |
| 最近记录: |