[英]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.