Saltar al contenido

SQL: ¿Error de sintaxis con intersección?

Solución:

MySQL, que parece estar usando, no es compatible con INTERSECT sintaxis. Vas a tener que resolverlo de otra forma.

En este caso, es trivial -sólo necesitamos una lista de todos los proveedores que ofrecen “verde” y “rojo” de alguna parte- su consulta no se molesta en ver si las partes en sí están relacionadas, por lo que podemos resolverlo con bastante facilidad. como esto:

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, no creo que la consulta original sea una típica INTERSECT problema. Eche un vistazo al JOIN solución ofrecida por Vinko Vrsalovic para una solución general para emular el INTERSECT (que por cierto preferiría incluso si el RDBMS de hecho ofreciera INTERSECT de forma nativa).

Nada, MySQL no tiene la palabra clave INTERSECT. Puede reescribirlo como 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);

Esta consulta seguramente se puede escribir mejor, pero esto es para mostrar que intersect no es más que una combinación interna con una selección distinta, puede transformar automáticamente una en la otra.

Esto debería hacer lo que quieras:

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"
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *