这是我的疑问:
-- 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:整数,成本:真实)
粗体 =主键
答案 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)
假设我们有两个数据库表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")