Pregunta

Dadas estas dos tablas:

Foo (id, name)       -- PK = id
Bar (fooId, value)   -- PK = composite, fooId + value
                     -- value is a non-negative int

¿Cómo puedo encontrar todos los Foo.name s donde no hay una Barra, valor por encima de 0 correspondiente?

por ejemplo:

Foo
id   name
1    a
2    b
3    c

Bar
fooid    value
1        0
1        1
2        0
3        4

Result:
b
¿Fue útil?

Solución

Encuentro lo siguiente más fácil de leer y entender ...

SELECT foo.name
FROM foo
WHERE NOT EXISTS (SELECT 'x'
                  FROM bar
                  WHERE bar.fooid = foo.id
                    AND bar.value > 0)

Otros consejos

SELECT Name
FROM Bar
INNER JOIN Foo ON Foo.Id = Bar.fooId
GROUP BY fooId, name
HAVING SUM(Value) = 0

Esta consulta y la publicada por zodeus tardan aproximadamente el mismo tiempo en ejecutarse, sin embargo, esta no incluirá ningún registro Foo al que no se haga referencia en la tabla Bar. Por ejemplo, si también tuviera el registro Foo (4, d), esta consulta aún devolvería 'b', mientras que la consulta de zodeus devolvería 'b' y 'd'.

SELECT name FROM FOO WHERE id NOT IN(
    SELECT fooId FROM Bar GROUP BY fooId HAVING MAX(Value) > 0)
select Foo.name 
from Foo
where Foo.id not in 
(select Bar.fooid from Bar
where value > 0)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top