2014-03-07 50 views
1

表1:列A,B,C表2 :列A,B,C最快SQL&HQL查询为两个表

表2是表1中的不同的数据的副本。假定所有列是VARCHAR

寻找其可以取单个高效的查询:

  • 列A,B,C从表1表2从
  • 附加行,其中Table2.A的值不存在在表1.A

对于相同的查询,Oracle SQL & HQL之间的任何差异将不胜感激。

我乱搞连接,联合&负,但没能得到正确的组合。

+0

尝试相交,减,除 – Zeus

回答

1

SQL:

SELECT * 
FROM Table1 
UNION ALL 
SELECT * 
FROM Table2 T2 
WHERE NOT EXISTS(
    SELECT 'X' FROM Table1 T1 
    WHERE T1.A = T2.A 
) 

HQL:

必须执行两个不同的查询中丢弃由表2的结果元素在Java循环,因为在HQL不存在UNION命令。

Alternatatively你可以写为表1的第一个查询和第二查询必须有一个不能条款丢弃表1的字段。

解决方案1:

查询1:

SELECT * FROM Table1 

查询2: SELECT * FROM表2

,然后应用在Java代码中丢弃循环

解决方案2:

查询1:

SELECT * FROM Table1 

查询2:

SELECT * FROM Table2 WHERE Table2.A not in (SELECT Table1.A from Table1) 
1

该查询返回table1所有行,加上考虑到列atable2所有行不以table1存在,是公共密钥。

select a,b,c 
    from table1 
union 
    all 
select a,b,c 
    from table2 
where a not in(select a from table1); 

根据table1和table2的相对大小和预期的重叠情况,可能有不同的选项可用。

+0

谢谢@Ronnis。查询很棒。 但选择了Joe Taras的答案,因为这是一个可行的HQL解决方案。 –