SQL:带有intersect的语法错误?

时间:2010-02-20 16:46:51

标签: 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 Suppliers
JOIN Catalog ON Catalog.sid = Suppliers.sid
JOIN Parts ON Parts.pid = Catalog.pid
WHERE Parts.color = "green");

这是错误:

  

错误1064(42000):您有错误   在你的SQL语法中;检查手册   对应于您的MySQL服务器   用于正确语法的版本   近       “相交       (选择供应商.sid       来自供应商       在第6行上加入目录ON Catalog.sid = Sup“。

我做错了什么?

这是架构:

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

零件( pid:整数,pname:string,color:string)

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

粗体 =主键

6 个答案:

答案 0 :(得分:8)

您似乎使用的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提供的JOIN解决方案,以获得模拟INTERSECT的一般解决方案(即使RDBMS实际上本身提供INTERSECT,我也会更喜欢这种解决方案。)< / p>

答案 1 :(得分:4)

没有,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);

这个查询肯定可以更好地编写,但这是为了表明相交只是一个带有select distinct的内连接,你可以自动将一个转换为另一个。

答案 2 :(得分: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"

答案 3 :(得分:0)

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

//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上搜索。

答案 4 :(得分:0)

我认为SQL不支持INTERESCT

尝试这个

let links = document.querySelectorAll('.nav-link');

links.addEventListener('click', function() {
    this.classList.add('active');
});

答案 5 :(得分:0)

说明:

enter image description here

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

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

1。条款
当INTERSECT操作的结果需要一列时,可以使用IN子句。

2。存在条款
当INTERSECT操作的结果需要多列时,可以使用EXISTS子句。

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

答案:


在上述问题中,他们希望将单列作为结果,因此我们可以按以下方式使用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")