【问题标题】:How to select datas that doesnt match in another column如何选择另一列中不匹配的日期
【发布时间】:2016-09-14 16:36:20
【问题描述】:

所以我有这张桌子 A:

color        ID       MODEL
-----------------------------
red        | 10   |   HONDA
blue       | 10   |   TOYOTA
red        | 15   |   ISUZU
red        | 30   |   MITSUBISHI
red        | 5    |   HONDA
blue       | 5    |   SUBARU
orange     | 10   |   HYUNDAI
black      | 40   |   CHRYSLER

我想得到所有没有相同 id 的红色和蓝色

所以我的预期结果是:

color  ID
------------
red  | 15
red  | 30

【问题讨论】:

  • 但是还有30个...黄色
  • @robin - 检查所有答案,并提及对您不起作用的地方。
  • 嗨@Utsav!当我尝试您的代码时,它不包括红色 30,因为我有一个黄色 30,您能帮我解决这个问题吗?
  • 当我运行它时,它包括red 30。再次检查,如果不起作用,您能否提供准确的查询和输出?
  • 为什么要包含red,30? yellow,30 的存在符合您当前的规则,因此将其排除在外。您要实施的规则实际上是否选择所有具有红色或蓝色但不是两者都有 ID 的红色和蓝色模型?

标签: sql oracle select where


【解决方案1】:

或使用anti join

select t1.color, t1.id 
from 
    tableA t1
left outer join 
     tableA t2 on t2.id = t1.id and t2.color != t1.color 
where 
 t1.color in ('red', 'blue')
and t2.color is null

【讨论】:

  • 嗨@schurik!当我尝试您的代码时,它不包含red 30,因为我有一个yellow 30,您能帮我解决这个问题吗?
  • 你想“得到所有红色和蓝色,但没有相同的 id 和另一种颜色”为什么要包括红色 30?
  • 编辑了我的帖子。这个问题有点困扰我。我想得到所有没有相同 id 的红色和蓝色
【解决方案2】:

类似的东西

SELECT * 
FROM   yourtable 
WHERE  id IN (SELECT id 
              FROM   youtable 
              GROUP  BY id 
              HAVING Count(case when color IN ( 'red', 'blue' ) then 1 end) = 1) 

【讨论】:

    【解决方案3】:

    使用NOT EXISTS 查找具有匹配 id 但颜色不同的行:

    select *
    from yourtable a
    where a.color IN ('red', 'blue')
      and not exists (
        select 1
        from yourtable b
        where a.id = b.id
          and b.color NOT IN ('red', 'blue')
        )
    

    注意事项:

    • 为了高效查找,请考虑添加索引(更多不同的值意味着更高的树遍历效率)
    • 考虑使用附加字典 color 表对数据进行规范化

    【讨论】:

    • 嗨@kamil g!当我尝试您的代码时,它不包括红色 30,因为我有一个黄色 30,您能帮我解决这个问题吗?
    • 嗯,这是根据您的要求预期的。 “我想要所有红色和蓝色不具有相同 id 的其他颜色。”
    【解决方案4】:

    我认为您的预期结果应该只是红色 15。红色 30 不符合条件,因为黄色 30 共享相同的 id。查看我的代码:

    SELECT t.id, t.color
    FROM t
    INNER JOIN
    (SELECT id
     FROM t
     GROUP BY id
     HAVING COUNT(*) = 1) sub
    ON t.id = sub.id
    WHERE color = 'red'
    OR color = 'blue'
    

    【讨论】:

      【解决方案5】:

      删除了之前的答案。对此进行了测试,它正在工作。

      WITH tbl
      AS (SELECT
        color,
        id
      FROM TABLE1
      WHERE color IN ('red', 'blue')
      )
      SELECT
        t1.color,
        t1.id
      FROM tbl t1
      LEFT JOIN tbl t2
        ON t1.id = t2.id
        AND t1.color <> t2.color
      WHERE t1.id IS NULL
      OR t2.id IS NULL
      

      【讨论】:

        【解决方案6】:

        此查询返回颜色为红色或蓝色但不是两者兼有的所有 ID。

        select id , color
        from  your_table 
        where color in ('red', 'blue')
        and id in (
            select id 
            from   your_table 
            where color in ('red', 'blue')
            group by id 
            having count(*) = 1) 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-11
          • 2020-03-17
          • 1970-01-01
          相关资源
          最近更新 更多