it-swarm-eu.dev

Proč zástupné znaky ve výpisech GROUP BY nefungují?

Snažím se, aby následující příkaz SQL fungoval, ale mám chybu syntaxe:

SELECT A.*, COUNT(B.foo)
FROM TABLE1 A
LEFT JOIN TABLE2 B ON A.PKey = B.FKey
GROUP BY A.*

Zde je A široká tabulka se 40 sloupci a rád bych se vyhnul uvedení všech názvů sloupců v klauzuli GROUP BY, pokud je to možné. Mám mnoho takových tabulek, nad nimiž musím spustit podobný dotaz, takže budu muset napsat Uloženou proceduru. Jaký je nejlepší způsob, jak toho dosáhnout?

Používám MS SQL Server 2008.

29

GROUP BY A.* není v SQL povoleno.

Můžete to obejít pomocí poddotazu, ve kterém seskupíte, a poté se připojit:

SELECT A.*, COALESCE(B.cnt, 0) AS Count_B_Foo
FROM TABLE1 AS A
  LEFT JOIN 
      ( SELECT FKey, COUNT(foo) AS cnt
        FROM TABLE2 
        GROUP BY FKey
      ) AS B 
    ON A.PKey = B.FKey ;

Ve standardu SQL-2003 existuje funkce, která umožňuje v seznamu SELECT sloupce, které nejsou v GROUP BY list, pokud na nich funkčně závisí. Pokud byla tato funkce implementována v SQL-Serveru, mohl být váš dotaz zapsán jako:

SELECT A.*, COUNT(B.foo)
FROM TABLE1 A
LEFT JOIN TABLE2 B ON A.PKey = B.FKey
GROUP BY A.pk                          --- the Primary Key of table A

Tato funkce bohužel zatím nebyla implementována, a to ani ve verzi SQL-Server 2012 - a pokud to vím, ne v žádné jiné DBMS. S výjimkou MySQL, která ji má, ale neadekvátně (neadekvátně jako: výše uvedený dotaz bude fungovat, ale motor nebude provádět žádnou kontrolu funkční závislosti a jiné špatně napsané dotazy budou ukazovat špatné, polohodlané výsledky).

Jak nás @ Mark Byers informoval v komentáři, PostgreSQL 9.1 přidal novou funkci určenou pro za tímto účelem. Je přísnější než implementace MySQL.

32
ypercubeᵀᴹ

Kromě řešení @ ypercube není „psaní“ nikdy výmluvou k použití SELECT *. Jsem o tom jsem zde psal , a dokonce i při řešení si myslím, že by váš seznam SELECT měl stále obsahovat názvy sloupců - i když existuje obrovské číslo jako 40.

Dlouhý příběh krátký, můžete se vyhnout psaní těchto velkých seznamů klepnutím a přetažením uzlu Sloupce pro objekt v Průzkumníku objektů do okna dotazu. Snímek obrazovky ukazuje pohled, ale totéž lze udělat pro stůl.

enter image description here

Ale pokud si chcete přečíst o všech důvodech proč , měli byste se podrobit této obrovské snaze přetáhnout položku o pár centimetrů, přečtěte si můj příspěvek . :-)

24
Aaron Bertrand