Выберите записи из таблицы, где все другие записи с таким же внешним ключом имеют определенное значение - PullRequest
2 голосов
/ 18 января 2012

У меня есть следующая таблица

ItemStatus
----------
id
item_id
status

Я хочу выбрать все item_id, где статус для каждой записи с этим item_id в таблице равен A.

Например, если записи были такими:

id    item_id    status
-----------------------
1        1          A
2        1          B
3        2          A
4        2          A
5        3          B

Тогда единственный item_id, который я получу, это 2.

Ответы [ 3 ]

6 голосов
/ 18 января 2012
    select item_id
    from YourTable
    group by item_id
    having sum(case when status='A' then 1 else 0 end) = count(1)
1 голос
/ 18 января 2012

Примерно так должно работать:

SELECT DISTINCT item_id
FROM your_table t1
WHERE
    NOT EXISTS (
        SELECT *
        FROM your_table t2
        WHERE t1.item_id = t2.item_id AND t2.status <> 'A'
    )

На простом английском языке: выберите каждый item_id, для которого нет строки со статусом, отличным от 'A'.

--- РЕДАКТИРОВАТЬ ---

Вариация Идея Акулы :

SELECT item_id
FROM your_table
GROUP BY item_id
HAVING min(status) = 'A' AND max(status) = 'A'

Это может быть очень приятно оптимизировано СУБД при условииу вас есть индекс {item_id, status}.Вот план выполнения SQL Server:

enter image description here

1 голос
/ 18 января 2012
select distinct item_id
from ItemStatus
where status = 'A'
and item_id not in
(
    select item_id
    from ItemStatus
    where status != 'A'
    or status is null
)

приводит к списку item_ids, которые появляются как A хотя бы один раз и никогда не появляются как что-либо еще

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...