我已经将SO上的所有查询都提到了类似的案例。虽然错误可能很常见,但我正在寻找具体案例的解决方案。请不要将问题标记为重复,除非您与已接受的解决方案完全相同。
我有两张桌子
Main table:
c1 c2 c3 c4 c5
1 2 3 4 A
Other table
c1 c2 c3 c4 c5
1 8 5 6 B
8 2 8 9 C
8 7 3 9 C
8 7 9 4 C
5 6 7 8 D
现在,从另一个表中,我应该只能在所有列中选择唯一的记录。例如最后一行(5,6,7,8, D
)。
其他表中的第1行被拒绝,因为c1值(1)与主表中的c1值(1)相同,第2行被拒绝,因为其他表和主表的c2值匹配,同样...
简而言之,其他表中的列都不应该在查询输出的主表中具有相同的值(在相应的列中)。
我尝试创建以下查询
select t1.* from otherTable t1
LEFT OUTER JOIN mainTable t2
ON ( t1.c1 = t2.c1 OR t1.c2 = t2.c2 OR t1.c3 = t2.c3 OR t1.c4 = t2.c4 )
Where t2.c5 is null;
但是,hive会抛出异常
目前在JOIN中不支持
我理解蜂巢限制,并且很多时候我使用内部联接的UNION (ALL | DISTINCT)
来克服这个限制;但是无法使用相同的策略。
请帮忙。
编辑1 :我有hive版本限制 - 只能使用版本1.2.0
答案 0 :(得分:0)
您可以进行笛卡尔积连接(无条件的内连接):
select t1.* from otherTable t1
,mainTable t2
WHERE t1.c1 != t2.c1 AND t1.c2 != t2.c2
AND t1.c3 != t2.c3 AND t1.c4 != t2.c4 AND t1.c5 != t2.c5;
假设mainTable
中有一行,此查询应与使用OUTER JOIN
的查询一样有效
另一种选择是将您提出的查询分解为5个不同的LEFT OUTER JOIN
子查询:
select t1.* from (
select t1.* from (
select t1.* from (
select t1.* from (
select t1.* from otherTable t1
LEFT OUTER JOIN (select distinct c1 from mainTable) t2
ON ( t1.c1 = t2.c1) Where t2.c1 is null ) t1
LEFT OUTER JOIN (select distinct c2 from mainTable) t2
ON ( t1.c2 = t2.c2) Where t2.c2 is null ) t1
LEFT OUTER JOIN (select distinct c3 from mainTable) t2
ON ( t1.c3 = t2.c3) Where t2.c3 is null ) t1
LEFT OUTER JOIN (select distinct c4 from mainTable) t2
ON ( t1.c4 = t2.c4) Where t2.c4 is null ) t1
LEFT OUTER JOIN (select distinct c5 from mainTable) t2
ON ( t1.c5 = t2.c5) Where t2.c5 is null
;
在这里,对于每一列,我首先从mainTable
获取不同的列,然后将其与otherTable
左侧的内容联系起来。缺点是我在mainTable
上传递了5次 - 每列一次。如果主表中的值是唯一的,则可以从子查询中删除distinct
。