Вернуть, если все значения соответствуют критериям - PullRequest
0 голосов
/ 11 июля 2019

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

T1:
1
2
3
4
5

Т2:

T.ID  Id  Value
1     01  Apple
1     02  Banana
2     05  Grapes
2     07  Kiwi
2     08  Apple
3     04  Banana
3     06  Potato
4     10  Honeydew
4     11  Berries
5     14  Apple
5     15  Kiwi
5     16  Radish

Мне нужно идентифицировать все идентификаторы в T1, которые являются Fruit в T2, T2.value в (яблоко, виноград, банан, киви, медвяная роса, ягоды)
Желаемый вывод:

1
2
4

Я пробовал это:

select t1.id from t1,t2
where t1.id = t2.id
and t2.value  in ('Apple','Grapes','Banana','Kiwi','Honeydew','Berries') 

но он не возвращает нужный мне вывод, он также возвращает # 3 и 5.

Ответы [ 3 ]

1 голос
/ 11 июля 2019

Предполагая, что вы хотите идентификаторы, которые имеют хотя бы одну строку в t2

select t2.id
from t2
group by t2.id
having sum(case when t2.value not in ('Apple', 'Grapes', 'Banana', 'Kiwi', 'Honeydew', 'Berries')
                then 1 else 0
           end) = 0;  -- nothing that isn't fruit
1 голос
/ 11 июля 2019

Очевидно, что вы пытаетесь устранить группы, которые содержат элементы, которые не фрукты:

SELECT T1.ID
  FROM T1
  WHERE T1.ID NOT IN (SELECT T2.T1_ID
                        FROM T2
                        WHERE T2.VALUE NOT IN ('Apple','Grapes','Banana','Kiwi','Honeydew','Berries'))
  ORDER BY T1.ID

dbfiddle здесь

0 голосов
/ 11 июля 2019

Добавление еще одного возможного ответа здесь.

В таких случаях вы можете использовать EXISTS.

SELECT
    T1.ID
FROM
    T1
WHERE
    NOT EXISTS (
        SELECT
            1
        FROM
            T2
        WHERE
            T2.T1_ID = T1.ID
            AND T2.VALUE NOT IN (
                'Apple',
                'Grapes',
                'Banana',
                'Kiwi',
                'Honeydew',
                'Berries'
            )
    )

db <> fiddle demo

Ура !!

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