Come usare group by con union in t-sql
-
05-07-2019 - |
Domanda
Come posso usare group by con union in t-sql? Voglio raggruppare per la prima colonna di un risultato di unione, ho scritto il seguente sql ma non funziona. Non so come fare riferimento alla colonna specificata (in questo caso è 1) del risultato del sindacato. grazie mille.
SELECT *
FROM ( SELECT a.id ,
a.time
FROM dbo.a
UNION
SELECT b.id ,
b.time
FROM dbo.b
)
GROUP BY 1
Soluzione
Raggruppa per 1
Non ho mai conosciuto GROUP BY per supportare l'utilizzo di ordinali, solo ORDER BY. Ad ogni modo, solo MySQL supporta GROUP BY che non include tutte le colonne senza funzioni aggregate eseguite su di esse. Gli ordinali non sono raccomandati neanche perché se sono basati sull'ordine del SELECT - se questo cambia, anche il tuo ORDER BY (o GROUP BY se supportato).
Non è necessario eseguire GROUP BY
sui contenuti quando si utilizza UNION
- UNION garantisce che i duplicati vengano rimossi; UNION ALL
è più veloce perché non lo è - e in quel caso avresti bisogno di GROUP BY ...
La tua query deve essere solo:
SELECT a.id,
a.time
FROM dbo.TABLE_A a
UNION
SELECT b.id,
b.time
FROM dbo.TABLE_B b
Altri suggerimenti
È necessario alias la query secondaria. Pertanto, la tua dichiarazione dovrebbe essere:
Select Z.id
From (
Select id, time
From dbo.tablea
Union All
Select id, time
From dbo.tableb
) As Z
Group By Z.id
Identificare la colonna è semplice:
SELECT *
FROM ( SELECT id,
time
FROM dbo.a
UNION
SELECT id,
time
FROM dbo.b
)
GROUP BY id
Ma non risolve il problema principale di questa query: cosa si deve fare con i valori della seconda colonna dopo il raggruppamento per primo? Dato che (in modo particolare!) Stai usando UNION
anziché UNION ALL
, non avrai righe interamente duplicate tra i due sottotitoli nella unione, ma potresti comunque avere diversi valori di tempo per un valore dell'id e non dai alcun suggerimento su cosa vuoi fare: min, max, avg, sum o cosa ?! Il motore SQL dovrebbe dare un errore a causa di ciò (anche se alcuni come mysql scelgono un valore casuale tra i vari, credo che sql-server sia migliore di così).
Quindi, ad esempio, cambia la prima riga in SELECT id, MAX (time)
o simili!
with UnionTable as
(
SELECT a.id, a.time FROM dbo.a
UNION
SELECT b.id, b.time FROM dbo.b
) SELECT id FROM UnionTable GROUP BY id