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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top