Frage
Vor dem Hintergrund dieser beiden Tabellen:
Foo (id, name) -- PK = id
Bar (fooId, value) -- PK = composite, fooId + value
-- value is a non-negative int
Wie kann ich alle Foo.name
s finden, wo es kein entsprechender Bar,value
über 0 ist?
Beispiel:
Foo
id name
1 a
2 b
3 c
Bar
fooid value
1 0
1 1
2 0
3 4
Result:
b
Lösung
Ich finde die im Anschluss an die am einfachsten zu lesen und verstehen ...
SELECT foo.name
FROM foo
WHERE NOT EXISTS (SELECT 'x'
FROM bar
WHERE bar.fooid = foo.id
AND bar.value > 0)
Andere Tipps
SELECT Name
FROM Bar
INNER JOIN Foo ON Foo.Id = Bar.fooId
GROUP BY fooId, name
HAVING SUM(Value) = 0
Diese Abfrage und die von zodeus geschrieben man nehmen etwa die gleiche Länge der Zeit auszuführen, aber das wird man alle Foo Datensätze nicht enthalten, die von der Bar-Tabelle verwiesen wird, nicht. Zum Beispiel, wenn Sie hat auch den Rekord Foo (4, d), würde diese Abfrage noch zurückkehren ‚b‘, wo als zodeus Abfrage würde ‚b‘ und ‚d‘ zurück.
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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow