SQL比较不同表

时间:2017-06-18 13:30:04

标签: mysql sql

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

e.g。

表1

    ID      product     cat1  cat2   cat3
    10001   product a   A     B      C 
    10001   product a   D     E      NULL
    10001   product a   F     G      H      
    10002   product b   B     C      D 
    ...     ...         ...   ...    ...

表2

    ID      product     cat1  cat2
    10001   product a   D     E
    10001   product a   D     F
    10001   product a   G     A      
    10002   product b   A     C
    ...     ...         ...   ...    ...

查询的输出应该类似于:

product_id    not_in_cat
10001         B
10001         C
10001         H
10002         B
10002         D

但我不知道我怎么能意识到这一点。我尝试使用子查询和“NOT IN”命令执行此操作。但是这样我得到了许多子查询,对于t1.cat1 - t2.cat1,t1.cat2 - t2.cat2的每个组合,依此类推。 这样我只得到了不在同一排的猫。

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

1 个答案:

答案 0 :(得分: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也可以。

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