Это - мой запрос:
-- 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 ИЗ Каталога СОЕДИНЕНИЯ Поставщиков ПО Catalog.sid = Глоток" на строке 6.
Что я делаю неправильно?
Это - схема:
Поставщики (sid: целое число, sname: строка, строка адреса)
Части (pid: целое число, pname: строка, цвет: строка)
Каталог (sid: целое число, pid: целое число, стоимость: реальный)
полужирный = первичный ключ
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
. Взгляните на решение JOIN
, предложенное Винко Врсаловичем в качестве общего решения для эмуляции INTERSECT
(которое я, кстати, предпочел бы, даже если бы СУБД действительно предлагала INTERSECT
INTERSECT
изначально).
Ничего, в 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 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"