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.names 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
War es hilfreich?

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
scroll top