Вопрос

Учитывая эти две таблицы:

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

Как мне найти все Foo.nameгде нет соответствующего Bar,value выше 0?

например:

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, занимает примерно одинаковое время, однако он не будет включать записи Foo, на которые не ссылается таблица Bar.Например, если у вас также есть запись 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