Pergunta

Esta é minha consulta:

-- 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");

Este é o erro:

Erro 1064 (42000): você tem um erro na sua sintaxe SQL; Verifique o manual que corresponde à sua versão do MySQL Server para obter a sintaxe correta para usar próximo "Intersect (selecione fornecedores.sid entre os fornecedores, junte -se ao catálogo no catálogo.sid = sup" na linha 6.

O que estou fazendo errado?

Este é o esquema:

Fornecedores (Sid: Inteiro, SNAME: String, String de endereço)

Peças (PID: Inteiro, pname: string, cor: string)

Catálogo(Sid: Inteiro, PID: Inteiro, custo: real)

negrito = chave primária

Foi útil?

Solução

Mysql, que você parece estar usando, não suporta o INTERSECT sintaxe. Você terá que resolver de outra maneira.

Nesse caso, é trivial - precisamos apenas de uma lista de todos os fornecedores que oferecem "verde" e "vermelho" de alguma parte - sua consulta não se preocupa em ver se as peças estão relacionadas, para que possamos resolvê -lo com bastante facilidade assim:

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

Pessoalmente, não acredito que a consulta original seja uma típica INTERSECT problema. Dê uma olhada no JOIN Solução oferecida por Vinko Vrsalovic para uma solução geral para emular INTERSECT (que eu preferiria, mesmo que os rdbms de fato oferecessem INTERSECT nativamente).

Outras dicas

Nada, o MySQL não tem a palavra -chave intersect. Você pode reescrevê -lo como uma junção interna:

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);

Essa consulta certamente pode ser melhor escrita, mas isso é para mostrar que se cruzar é apenas uma junção interna a uma distinta selecionada, você pode transformar um automaticamente um no outro.

Isso deve fazer o que você quiser:

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"

Outra solução para usar Cruzar em mysql é usar DENTRO cláusula. Problema: "Encontre ids de cursos de cursos oferecidos no outono de 2009 e primavera de 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’);

Em 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 você precisar mais de DENTRO Cláusula, pesquise no Google.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top