SQL:带有intersect的语法错误?

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本机,我也会更喜欢).


Vin*_*vic 5

没什么,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 的内部连接,您可以自动将一个转换为另一个。