12

这是我的查询:

-- 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");

这是错误:

ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 6 行的“INTERSECT (SELECT Suppliers.sid FROM Suppliers JOIN Catalog ON Catalog.sid = Sup”附近使用正确的语法。

我究竟做错了什么?

这是架构:

供应商(sid:整数,sname:字符串,地址字符串)

部分(pid:整数,pname:字符串,颜色:字符串)

目录(sid:整数,pid:整数,成本:实数)

粗体= 主键

4

6 回答 6

13

您似乎正在使用的 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

就个人而言,我不相信原始查询是一个典型的INTERSECT问题。看看JOINVinko Vrsalovic 提供的解决方案,以了解模拟的通用解决方案INTERSECT(顺便说一句,即使 RDBMS 实际上会INTERSECT本机提供,我也会更喜欢)。

于 2010-02-20T16:52:12.650 回答
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);

这个查询肯定可以写得更好,但这是为了表明 intersect 只是一个带有 select distinct 的内部连接,您可以自动将一个转换为另一个。

于 2010-02-20T16:53:41.260 回答
2

这应该做你想要的:

SELECT Suppliers.sid
FROM Suppliers
JOIN Catalog ON Catalog.sid = Suppliers.sid
INNER JOIN Parts AS parts1 ON parts1.pid = Catalog.pid AND parts1.color = "red"
INNER JOIN Parts AS parts2 ON parts2.pid = Catalog.pid AND parts2.color = "green"
于 2010-02-20T16:50:12.797 回答
1

在 MySQL 中使用INTERSECT的另一个解决方案是使用IN子句。问题:“查找 2009 年秋季和 2010 年春季提供的课程的课程 ID”

//DML sample
(select course_id
from section
where semester = ‘Fall’ and year = ‘2009’)
intersect
(select course_id
from section
where semester = ‘Spring’ and year = ‘2010’);

在 MySQL 中:

select distinct course_id
from section
where semester = 'Fall' and year= 2009 and
course_id in (select course_id
from section
where semester = 'Spring' and year= 2010);

如果您需要更多关于IN子句的信息,请在 Google 上搜索。

于 2017-10-26T04:30:49.637 回答
0

我认为 SQL 不支持 INTERECT

试试这个

SELECT DISTINCT
s.sid
FROM
 suppliers s,
 catalog c
WHERE
 s.sid = c.sid
 AND c.pid IN (SELECT 
 p1.pid
 FROM
 parts p1,
 parts p2
 WHERE
 p1.color = 'red' AND p2.color = 'green');
于 2020-09-19T03:02:42.520 回答
0

描述:

在此处输入图像描述

假设我们有两个 DB 表 T1 和 T2,并且我们需要两个表中的公共元素,那么我们可以使用 INTERSECT 操作,如上图所示。

在 MySql 中没有 INTERSECT 运算符。所以我们可以用以下两个运算符来实现 INTERSECT 概念:

1. IN
子句 当我们想要一列作为 INTERSECT 操作的结果时,我们可以使用 IN 子句。

2. EXISTS
子句 当我们想要多个列作为 INTERSECT 操作的结果时,我们可以使用 EXISTS 子句。

有关更多详细信息,您可以在此处阅读文档。

回答:


在上面提出的问题中,他们想要单列作为结果,因此我们可以使用 IN 子句,如下所示:

SELECT Suppliers.sid FROM Suppliers 
INNER JOIN Catalog ON Catalog.sid = Suppliers.sid 
INNER JOIN Parts ON Parts.pid = Catalog.pid 
WHERE Parts.color = "red"
AND Suppliers.sid IN (
    SELECT Suppliers.sid
    FROM Suppliers
    INNER JOIN Catalog ON Catalog.sid = Suppliers.sid
    INNER JOIN Parts ON Parts.pid = Catalog.pid
    WHERE Parts.color = "green")
于 2020-09-19T04:08:54.710 回答