SQL:intersect的语法错误?

SQL:intersect的语法错误?,sql,mysql,intersect,Sql,Mysql,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

这是我的疑问:

-- 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");
这就是错误:

错误1064 42000:您有一个错误 在SQL语法中;检查手册 对应于MySQL服务器的 要使用的正确语法的版本 近的 横断 选择Suppliers.sid 来自供应商 第6行的Catalog.sid=Sup上的JOIN Catalog

我做错了什么

这是模式:

供应商ID:整数、sname:字符串、地址字符串

Partspid:integer,pname:string,color:string

Catalogsid:integer,pid:integer,成本:real


bold=主键这应该是您想要的:

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"

您似乎正在使用的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问题。看看Vinko Vrsalovic提供的连接解决方案,它是一个模拟INTERSECT的通用解决方案,顺便说一句,即使RDBMS实际上在本地提供INTERSECT,我也更喜欢它。

没有,MySQL没有INTERSECT关键字。您可以将其重写为内部联接:

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

在MySQL中使用intersect的另一个解决方案是使用in子句。问题:查找2009年秋季提供的课程id和 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条款的信息,请在谷歌上搜索

我认为SQL不支持Interest

试试这个

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');
说明: 假设我们有两个DB表T1和T2,并且我们需要这两个表中的公共元素,那么我们可以使用INTERSECT操作,如上图所示

在MySql中没有INTERSECT操作符。因此,我们可以使用以下两个操作符实现INTERSECT概念:

一,。在条款中 当我们需要一列作为INTERSECT操作的结果时,可以使用IN子句

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

有关更多详细信息,请阅读文档

答复: 在上述问题中,他们希望结果为单列,所以我们可以在子句中使用如下内容:

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

我认为这不是这个案子的问题。MySQL根本不支持INTERSECT,而且该查询也无法运行。OP希望所有的小岛屿发展中国家都有一个绿色部分和一个红色部分。你的查询返回的所有SID要么是绿色的,要么是红色的。@Roland,@Vinko:是的,我看到了,我修正了答案,这应该是他想要的,并且比子查询快。看看哪个更快会很有趣,这个查询还是我的查询-我想归结到哪个更快,第二次加入还是分组操作。@Hogan,耸耸肩。这取决于很多因素:索引、哪个引擎、多少行、多少内存。如果问题是找到最快的解决方案,我会采取完全不同的方法来回答这个问题。目前,我正处于这样一种模式:如何重写标准SQL,以在MySQL不支持语法的情况下获得相同的结果。重点是,我想我总是处于最快的模式,而不是最清晰的模式。我基本上同意,但INTERSECT与内部联接并不完全相同。INTERSECT默认为INTERSECT DISTINCT,这意味着只需要返回唯一的行。在实际情况下,可能在本例中也是如此,它只会起作用,但要获得真正的重写,您必须添加DISTINCT或GROUP BYall cool。你现在得到+1,因为我基本上认为JOIN比INTERSECT好得多:我唯一一次看到INTERSECT是在SQL作业中;例如,这里的另外两个答案是作为单个查询构建的,并且具有较少的总联接。
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")