簡體   English   中英

SQL:UNION與帶有UNION ALL子查詢的SELECT DISTINCT相同

[英]SQL: Is UNION the same as SELECT DISTINCT with UNION ALL subquery

在所有情況下,這兩個SQL語句是否相同?

SELECT DISTINCT * FROM 
(SELECT * FROM tablename UNION ALL SELECT * FROM tablename2) dummyname

SELECT * FROM tablename UNION SELECT * FROM tablename2

我總是發現關於UNION的特有之處在於,即使那些不明顯的行出現在UNION子句的單個部分中,它也會刪除所有不明顯的行。 例如,假設表名具有一列:amt INT。 假設amt INT不是主鍵,並且對它沒有任何唯一約束。 然后,假設我有兩行,其中amt =20。無論我執行什么UNION,這兩行中的只有一行會出現在結果集中。

我向其他人解釋了此行為,然后拿出了上面的示例來演示UNION的行為...我相信上面的這兩個語句(總是)是相同的,但是我只是想確保我所說的是正確。 是否存在上述兩種SQL語句無法生成完全相同的結果集的極端情況?

這兩個版本是相同的: UNION在功能上等效於UNION ALL上的SELECT DISTINCT

UNION刪除表中的重復值以及兩個表之間共享的值。

我應該注意,從性能的角度來看,以下操作通常比僅UNION更快:

select distinct t.col1, t.col2
from t
union
select distinct t1.col1, t.col2
from t1;

這可能是違反直覺的。 但是,如果表中的(col1, col2)上有一個索引,則可以將其用於select distinct ,從而減少union的行數。 一些優化器可能會錯過這個機會來簡化輸入。

簡而言之,可以在這里找到說明:

/* Declare First Table */
DECLARE @Table1 TABLE (ColDetail VARCHAR(10))
INSERT INTO @Table1
SELECT 'First'
UNION ALL
SELECT 'Second'
UNION ALL
SELECT 'Third'
UNION ALL
SELECT 'Fourth'
UNION ALL
SELECT 'Fifth'
/* Declare Second Table */
DECLARE @Table2 TABLE (ColDetail VARCHAR(10))
INSERT INTO @Table2
SELECT 'First'
UNION ALL
SELECT 'Third'
UNION ALL
SELECT 'Fifth'

SELECT DISTINCT * FROM (SELECT * FROM @Table1 UNION ALL SELECT * FROM @Table2) dummyname

結果1:

在此處輸入圖片說明

SELECT * FROM @Table1 UNION SELECT * FROM @Table2

結果2:

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM