2009-10-22 10 views
17

Jak używać grupy przez przy połączeniu w t-sql? Chcę grupować przez pierwszą kolumnę wyniku związku, napisałem następujący sql, ale to nie działa. Po prostu nie wiem, jak odwołać się do określonej kolumny (w tym przypadku jest 1) wyniku związku. wielkie dzięki.Jak używać grupy przez połączenie w t-sql

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

Odpowiedz

14

GROUP BY 1

Nigdy nie wiadomo, GROUP BY, żeby obsługiwać za pomocą liczb porządkowych, tylko ORDER BY. Tak czy inaczej, tylko MySQL obsługuje GROUP BY, nie uwzględniając wszystkich kolumn bez wykonywanych na nich funkcji agregujących. Polecenia nie są zalecane, ponieważ są oparte na kolejności SELECT - jeśli to się zmieni, zmienia się również ORDER BY (lub GROUP BY, jeśli jest obsługiwany).

Nie trzeba uruchamiać GROUP BY na zawartości, gdy używasz UNION - UNION zapewnia usunięcie duplikatów; UNION ALL jest szybszy, ponieważ nie - iw tym przypadku będzie trzeba GROUP BY ...

Zapytanie tylko musi być:

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

Identyfikacja kolumna jest łatwe:

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

Ale to nie rozwiązuje głównego problemu tego zapytania: co zrobić z wartościami drugiej kolumny podczas grupowania według pierwszej? Ponieważ (szczególnie!) Używasz UNION zamiast UNION ALL, nie będziesz mieć całkowicie zduplikowanych wierszy między dwoma podtablami w unii, ale możesz nadal mieć wiele wartości czasu dla jednej wartości id, i nie dajesz żadnej wskazówki, co chcesz robić - min, max, avg, suma, czy co ?! Silnik SQL powinien dać z tego powodu błąd (chociaż niektóre z nich, np. Mysql, wybierają losową wartość z kilku, wierzę, że serwer sql jest lepszy od tego).

Na przykład, zmień pierwszą linię na SELECT id, MAX(time) lub coś podobnego!

67

Musisz alias podzapytania. Zatem twoje oświadczenie powinno brzmieć:

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

dzięki @Thomas, jest dobre, niż jest proste! – ghiboz

+7

To powinna być zaakceptowana odpowiedź. –

+1

Kluczowy punkt to dodawanie aliasu do podkwerendy (AS Z) – isxaker