2014-03-07 81 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解決方案。 –