SQL: Errore di sintassi con Intersect?
Domanda
Questa è la mia domanda:
-- 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");
Questo è l'errore:
ERRORE 1064 (42000): Hai un errore nella vostra sintassi SQL; controllare il manuale che corrisponde al server MySQL versione per la sintassi diritto di utilizzare vicino "INTERSECT (SELEZIONA Suppliers.sid da fornitori JOIN catalogo Catalog.sid = Sup" on line 6.
Che cosa sto facendo di sbagliato?
Questo è lo schema:
Fornitori ( SID: intero , sname: string, string indirizzo)
Parti ( pid: intero , pname: string, colore: string)
Catalogo ( sid: integer, PID: intero , costo: vero e proprio)
grassetto = chiave primaria
Soluzione
MySQL, che sembrate essere utilizzato, non supporta la sintassi INTERSECT
. Si sta andando ad avere per risolvere in un altro modo.
In questo caso, è banale -Abbiamo solo bisogno di un elenco di tutti i fornitori che offrono "verde" e "rosso" di qualche parziale la query non si preoccupa di vedere se le parti stesse sono collegate, in modo che possiamo risolvere abbastanza facilmente in questo modo:
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
Personalmente, non credo che la query originale è un tipico problema INTERSECT
. Date un'occhiata alla soluzione JOIN
offerta da Vinko Vrsalovic per una soluzione generale per emulare il INTERSECT
(che io preferirei btw anche se il RDBMS sarebbe infatti offerta INTERSECT
nativamente).
Altri suggerimenti
Niente, MySQL non ha la parola chiave si intersecano. È possibile riscrivere come un 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);
Questa query può sicuramente essere scritta meglio, ma questo è quello di mostrare che si intersecano è, ma semplicemente un inner join con un selezionato distinta, è possibile trasformare automaticamente l'uno nell'altro.
Questo dovrebbe fare quello che vuoi:
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"
Un'altra soluzione al fine di utilizzare INTERSECT in MySQL è quello di utilizzare clausola. Problema: "Trova corso di id di corsi offerti in autunno 2009 e Primavera 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’);
In 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);
Se avete bisogno di più su clausola, si prega di ricerca su Google.