Pregunta

Un ejemplo muy simple de una relación n: m que me desconcierta. Supongamos que tenemos dos tablas " Planta " y " Atributo " y otra mesa entre ellos manteniendo su relación con sus identificaciones:

Plant--------hasAttribute--------Attribute
               P1 | A1
               P1 | A2
               P1 | A3
               P2 | A1
               P2 | A2
               P3 | A2
               P3 | A3 

Entonces, la Planta 1 tiene Atributos 1,2 y 3. La Planta 2 tiene Atributos 1 y 2 y la Planta 3 tiene Atributos 2 y 3. Ahora, en una sola consulta, ¿cómo puedo obtener, por ejemplo? Todas las plantas que tienen atributo 2 y 3? El resultado debe devolver P1 y P3 porque ambos tienen los atributos 2 y 3. Estaba intentando la unión, pero eso también me dará P2 ... ¿alguna idea?

Otros consejos

Esta estructura de consulta evita la necesidad de una cláusula distinta (siempre que no haya registros duplicados en la tabla de resolución).

SELECT p.PlantID
FROM
  Plant p INNER JOIN PlantAttribute pa
    ON p.PlantID = pa.PlantID AND pa.AttributeID = 1
  INNER JOIN PlantAttribute pa2
    ON p.PlantID = pa2.PlantID AND pa2.AttributeID = 2;
select * from Plants p where 2 = ( 
  select count(*) from HasPlants h
     where h.pid = p.id and h.aid in ( a2, a3 ) 
  )
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top