SQL: Синтаксическая ошибка с пересекается?

Это - мой запрос:

-- 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: целое число, стоимость: реальный)

полужирный = первичный ключ

8
задан Nick Heiner 21 February 2010 в 03:59
поделиться

3 ответа

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 изначально).

11
ответ дан 5 December 2019 в 10:02
поделиться

Ничего, в 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);

Этот запрос, безусловно, можно написать лучше, но он должен показать, что пересечение - это всего лишь внутреннее соединение с отдельным выбранным, вы можете автоматически преобразовать один в другой.

4
ответ дан 5 December 2019 в 10:02
поделиться

Это должно сделать то, что вы хотите:

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"
2
ответ дан 5 December 2019 в 10:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: