Question

Étant donné ces deux tableaux:

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

Comment puis-je trouver tous les Foo.name où aucun Bar, valeur supérieur à 0 ne correspond?

par exemple:

Foo
id   name
1    a
2    b
3    c

Bar
fooid    value
1        0
1        1
2        0
3        4

Result:
b
Était-ce utile?

La solution

Je trouve que ce qui suit est le plus facile à lire et à comprendre ...

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

Autres conseils

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

L'exécution de cette requête et de celle publiée par zodeus prend environ le même temps, mais celle-ci n'inclura aucun enregistrement Foo non référencé par la table Bar. Par exemple, si vous avez également l'enregistrement Foo (4, d), cette requête renvoie toujours 'b', tandis que la requête de zodeus renverrait 'b' et '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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top