質問

次の2つのテーブルを指定します:

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

対応する Bar、value が0より大きいすべての Foo.name を見つけるにはどうすればよいですか?

eg:

Foo
id   name
1    a
2    b
3    c

Bar
fooid    value
1        0
1        1
2        0
3        4

Result:
b
役に立ちましたか?

解決

次のものが読みやすく理解しやすいと思います...

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

他のヒント

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

このクエリとzodeusによってポストされたクエリの実行には、ほぼ同じ時間がかかりますが、このクエリには、Barテーブルによって参照されていないFooレコードは含まれません。たとえば、レコードFoo(4、d)もある場合、このクエリは 'b'を返しますが、zodeusのクエリは 'b'と '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)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top