【问题标题】:SQL compare multiple columns in different tablesSQL比较不同表中的多个列
【发布时间】:2017-06-18 13:30:03
【问题描述】:

我有两张桌子。表一有 3 个类别列。表 2 有 2 个类别列。我尝试编写一个比较此类别列的查询,并向我显示数据位于表 1 的三列之一中,但不在表 2 的两列之一中。

例如

表 1

ID 产品 cat1 cat2 cat3 10001 产品 a A B C 10001 产品 D E NULL 10001 产品 a F G H 10002 产品 b B C D ……………………

表 2

ID 产品 cat1 cat2 10001 产品 a D E 10001 产品一个 D F 10001 产品一个 G A 10002 产品 b A C ……………………

查询的输出应该是这样的:

product_id not_in_cat 10001乙 10001℃ 10001 小时 10002乙 10002 天

但我不知道如何实现它。我尝试使用子查询和“NOT IN”命令来做到这一点。但是这样我得到了很多子查询,对于 t1.cat1 - t2.cat1、t1.cat2 - t2.cat2 等的每个组合。 这样我只得到了不在同一行的猫。

也许有人可以帮我弄清楚,哪种方式最能达到预期的效果。 该查询在 MS SQL Server 上执行,并带有对 MySQL 和 oracle db 服务器的 openquery。但我认为这更像是一个逻辑问题。

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    我认为您应该“规范化”数据并使用union allgroup by 执行相当于完全外连接的操作。这看起来像:

    select id, cat
    from (select id, cat1 as cat, 1 as which from table1 union all
          select id, cat2 as cat, 1 as which from table1 union all
          select id, cat3 as cat, 1 as which from table1 union all
          select id, cat1 as cat, 2 as which from table2 union all
          select id, cat2 as cat, 2 as which from table2
         ) ic
    where cat is not null
    group by id, cat
    having min(which) = max(which);
    

    这会查找仅在其中一个表中的类别。注意:如果您知道两个表中没有重复项,那么 having count(*) = 1 也可以。

    而且,如果您想知道该类别所在的表格,请询问 另一个 问题。这与您提出的问题有点不同。

    【讨论】:

    • 好的,您可以很好地找到仅在其中一个表中的类别。但我的主要问题是编写一个查询“显示数据位于表 1 的三列之一中,但不在表 2 的两列之一中”
    • @dunno。 . .使用having max(which) = 1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-24
    • 2015-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多