e.g。
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 ... ... ... ... ...
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。但我认为这更像是一个逻辑问题。
答案 0 :(得分:1)
我认为你应该"正常化"数据并使用union all
和group 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
也可以。
并且,如果您想知道类别所在的表格,请询问另一个问题。这与你提出的问题有点不同。