【问题标题】:Return if all values meet the criteria如果所有值都符合条件则返回
【发布时间】:2019-07-11 14:02:49
【问题描述】:

我正在尝试返回子表中所有符合条件的记录的所有行

T1:
1
2
3
4
5

T2:

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 中的所有 id,它们是 T2 中的 Fruit, T2.value in(苹果、葡萄、香蕉、猕猴桃、蜜露、浆果)
期望的输出:

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。

【问题讨论】:

  • 你怎么知道哪些值是水果?
  • 我会明确搜索这些值。让我在我的问题中添加它
  • 您的文字列表中有大小写问题。看起来应该是('Apple','Grapes','Banana','Kiwi','Honeydew','Berries')
  • 更新了问题

标签: sql oracle


【解决方案1】:

假设您想要在t2 中至少有一行的 id

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

【讨论】:

    【解决方案2】:

    显然,您要做的是消除包含水果项目的组:

    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 here

    【讨论】:

    • 但这也会消除 1,2 和 4。
    • 我恭敬地承认它不会。请参阅 dbfiddle。
    【解决方案3】:

    在此处添加另一个可能的答案。

    在这种情况下,您可以使用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

    干杯!!

    【讨论】:

      猜你喜欢
      • 2014-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-12
      • 2019-12-23
      • 1970-01-01
      • 2021-10-15
      • 2016-05-03
      相关资源
      最近更新 更多