2013-03-22 53 views
3

我想知道如何根據1)Style和2)Performance來改進此表單的查詢。如果它很重要,我使用Oracle作爲我的數據庫。此外,此查詢的目的是從第一個選擇語句中選擇在LEFT JOIN右側的記錄集中沒有相應記錄的所有記錄。 ColumnA中的記錄在任何表中都不一定是唯一的。如何在SQL中加入多個select語句

select ColumnA 
from 
    (Select ColumnA 
    from Table1) 
left join 
    ((select ColumnA, ColumnB 
    from Table2) 
    union 
    (select ColumnA, ColumnB 
    from Table3)) 
using (ColumnA) 
where ColumnB is null 
group by ColumnA; 

謝謝。

+0

由於左連接和空測試:任何列定義爲NOT NULL? – Ronnis 2013-03-22 23:22:43

+0

是的,數據庫中的列都不爲NULL。 – Eduardo 2013-03-22 23:25:25

回答

3

我認爲你可以重寫此查詢到以下(見本SQL Fiddle):

SELECT DISTINCT ColumnA 
FROM (SELECT ColumnA 
     FROM Table1) 

MINUS 

(SELECT ColumnA 
FROM Table2 
UNION 
SELECT ColumnA 
FROM Table3); 

至於風格,我推薦使用顯式連接條件的語法LEFT JOIN ... ON table1.somecolumn = table2.someothercolumn代替爲了可讀性和清晰度,但這可能是個人喜好:-)

+0

我喜歡這種形式,因爲它正是我試圖實現的邏輯。是否有任何理由說明爲什麼這種形式可能因風格而不是首選?性能如何? – Eduardo 2013-03-22 23:57:51

+2

您可能想使用EXPLAIN PLAN來比較查詢的執行計劃。這是最近的一篇關於它的文章:http://stackoverflow.com/questions/15576158/understanding-explain-plan-in-oracle – DCookie 2013-03-23 01:57:59

2

我沒有看到的UNION需要:

select T1.ColumnA 
from Table1 T1 
    left join Table2 T2 ON T1.ColumnA = T2.ColumnA 
    left join Table3 T3 ON T1.ColumnA = T3.ColumnA 
where T2.ColumnA IS NULL 
    or T3.ColumnA IS NULL 
group by T1.ColumnA; 

另一種選擇是使用NOT IN

select distinct ColumnA 
from Table1 
where ColumnA not in (select ColumnA from Table2) 
    and ColumnA not in (select ColumnA from Table3); 

這兩個應該返回任何ColumnA表1中記載,麥凱納t在表2或表3中。

+1

+1。 。 。我認爲第二個選項是更清晰的選項,儘管它應該是「選擇不同的ColumnA」。 – 2013-03-22 23:38:02

+0

@戈登林諾夫 - 完全正確,忘記了這個組合! – sgeddes 2013-03-22 23:39:01

+0

我在下面提出這個問題,但它也適用於這個答案。就風格而言,在使用連接或子查詢之間是否存在偏好? – Eduardo 2013-03-22 23:51:17

2

這裏有三種選擇。

select distinct ColumnA 
    from Table1  a 
    left join Table2 b using(ColumnA) 
    left join Table3 c using(ColumnA) 
where b.ColumnB is null 
    and c.ColumnB is null; 

select distinct ColumnA 
    from Table1 a 
where ColumnA not in(select ColumnA from Table2) 
    and ColumnA not in(select ColumnA from Table3); 

select distinct ColumnA 
    from Table1 a 
where ColumnA not in(select ColumnA from Table2 union 
         select ColumnA from Table3); 
+0

就樣式而言,在使用連接或子查詢之間是否存在偏好? – Eduardo 2013-03-22 23:48:19

+0

你應該在你的第一個查詢的where子句中使用'AND'而不是'OR',因爲你是對的第一個查詢 – 2013-03-23 04:43:59

+0

@EgorSkriptunoff。 – Ronnis 2013-03-23 20:14:05