2009-10-22 68 views
17

如何使用t-sql中的union使用group?我想按照聯合的結果的第一列進行分組,我寫了下面的sql,但它不起作用。我只是不知道如何引用聯合結果的指定列(在本例中爲1)。 非常感謝。如何使用t-sql中的union使用組

SELECT * 
FROM (SELECT a.id , 
        a.time 
      FROM  dbo.a 
      UNION 
      SELECT b.id , 
        b.time 
      FROM  dbo.b 
     ) 
GROUP BY 1 

回答

14

GROUP BY 1

我從來不知道GROUP BY,以支持使用序數,只有ORDER BY。無論哪種方式,只有MySQL支持GROUP BY不包括沒有對其執行聚合函數的所有列。不推薦使用常規,因爲如果它們基於SELECT的順序 - 如果更改,則您的ORDER BY(或GROUP BY,如果支持)也會更改。

使用UNION時,無需在內容上運行GROUP BY - UNION可確保刪除重複項; UNION ALL比較快,因爲它沒有 - 在這種情況下,你需要在GROUP BY ...

你的查詢只需要爲:

SELECT a.id, 
     a.time 
    FROM dbo.TABLE_A a 
UNION 
SELECT b.id, 
     b.time 
    FROM dbo.TABLE_B b 
6

識別列很簡單:

SELECT * 
FROM (SELECT id, 
        time 
      FROM  dbo.a 
      UNION 
      SELECT id, 
        time 
      FROM  dbo.b 
     ) 
GROUP BY id 

但它並沒有解決這個查詢的主要問題:什麼是要與第二列中的值和分組時由第一呢?由於(獨有的!)你正在使用UNION而不是UNION ALL,你不會有完全複製在工會兩個子表之間行,但你仍然很可能有幾個時間值的一個ID值,而你並沒有暗示你想要做什麼 - 最小,最大,平均,總和還是什麼?! SQL引擎應該給出一個錯誤,因爲它(儘管一些例如mysql只是從幾個中選擇一個隨機值,我相信sql-server比這更好)。

因此,例如,第一行更改爲SELECT id, MAX(time)或之類的!

67

您需要別名子查詢。因此,你的陳述應該是:

Select Z.id 
From (
     Select id, time 
     From dbo.tablea 
     Union All 
     Select id, time 
     From dbo.tableb 
     ) As Z 
Group By Z.id 
+1

謝謝@Thomas,比簡單好! – ghiboz 2012-07-01 14:29:20

+7

這應該是被接受的答案。 – 2014-03-14 19:14:43

+1

關鍵是將別名添加到子查詢(AS Z) – isxaker 2015-02-09 13:26:23