GROUP BY ifadelerindeki joker karakterler neden çalışmıyor?


29

Aşağıdaki SQL deyimini çalışır duruma getirmeye çalışıyorum, ancak bir sözdizimi hatası alıyorum:

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

Burada A, 40 sütunlu geniş bir tablodur ve mümkünse GROUP BY deyimindeki her bir sütun adını listelemekten kaçınmak istiyorum. Üzerinde benzer bir sorgu çalıştırmam gereken pek çok tablo var, bu yüzden bir saklı yordam yazmak zorunda kalacağım. Buna yaklaşmanın en iyi yolu nedir?

MS SQL Server 2008 kullanıyorum.

Yanıtlar:


32

GROUP BY A.* SQL'de izin verilmiyor.

Bunu, grupladığınız bir alt sorguyu kullanarak atlayabilir ve ardından katılabilirsiniz:

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 ;

SQL-2003 standardında, SELECTlistede GROUP BYişlevsel olan bağımlı oldukları sürece listede bulunmayan sütunlara izin veren bir özellik vardır . Bu özellik SQL Server'da uygulanmış olsaydı, sorgunuz şu şekilde yazılmış olabilirdi:

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

Ne yazık ki, bu özellik henüz SQL Server 2012 sürümünde bile uygulanmadı - ve bildiğim kadarıyla herhangi bir başka DBMS'de uygulanmadı. Sahip olan ancak yetersiz olan MySQL dışında (yetersiz olduğu şekilde: yukarıdaki sorgu çalışacaktır ancak motor işlevsel bağımlılık için herhangi bir kontrol yapmaz ve diğer yazılı olmayan sorgular yanlış, yarı rasgele sonuçlar gösterecektir).

@ Mark Byers'in bir yorumda bizi bilgilendirdiği gibi , PostgreSQL 9.1 bu amaç için tasarlanmış yeni bir özellik ekledi . MySQL'in uygulanmasından daha kısıtlayıcıdır.


Standardın bu bölümünü yazılı olarak uygulayan birkaç RDBMS'den bahsedebilir misiniz? Biliyorum, örneğin, o MySQL (verilen uygun ayarları) değil içindeki öğeleri içerir sağlayacak GROUP BYbendinde SELECTlistesinde, ama buna değer (böylece kolon veya ifade varsa gelecek ki hangi satırı olarak tanımlanmamış bırakır değil mi 't gruplama sentezleme üzerine işlevsel olarak bağlıdır, o zaman olabilir ) grup içindeki herhangi bir üst üste gelir.
Adam Robinson

@Adam: Hayır, uyguladığı hiçbir RDBMS'yi tanımıyorum. MySQL'de var ama yetersiz, yorumunuzun dediği gibi.
ypercubeᵀᴹ

Yakaladım. Aslında sorup sormadığımı sordum, çünkü bu sitedeki soruları yanıtlayan insanların çoğunun hayal edebileceğimden çok daha az RDBMS konusunda deneyimim vardı;) Ama bu benim şüphemdi.
Adam Robinson

3
"ve bildiğim kadarıyla herhangi bir başka DBMS'de değil." PostgreSQL 9.1 , bu amaç için tasarlanmış yeni bir özellik ekledi . MySQL'in uygulanmasından daha kısıtlayıcıdır.
Mark Byers

@MarkByers: thnx, bunu bilmiyordum.
ypercubeᵀᴹ

24

@ Ypercube'nin geçici çözümüne ek olarak, "yazmak" hiçbir zaman bir bahane değildir SELECT *. Ben ettik burada bu konuda yazılı ve hatta birlikte senin düşünüyorum Geçici çözüm SELECTlistesi hala sütun adlarını içermelidir - 40 gibi büyük bir sayı olsa bile.

Uzun lafın kısası, Nesne Gezgini'ndeki nesnenin Sütunlar düğümünü tıklayarak ve sürükleyerek sorgu pencerenize sürükleyerek bu büyük listeleri yazmaktan kaçınabilirsiniz. Ekran görüntüsü bir görünümü gösteriyor ancak aynı şey bir masa için de yapılabilir.

görüntü tanımını buraya girin

Ancak, neden bir öğeyi birkaç inç sürüklemek için bu kadar büyük bir çaba harcayacağınızla ilgili tüm nedenleri okumak istiyorsanız , lütfen yazımı okuyun . :-)


PostgreSQL'de (EMS SQL Manager ile) bunu bir görünüm tanımlayarak yapıyorum SELECT *ve ardından alan listesini görünüm tanımından kopyaladım.
dezso,

SELECT *Kullanılmaması gerektiğine kesinlikle katılıyorum . GROUP BYYine de olayı merak ediyorum . @Aaron, Grupla listesinde 40 sütun olması ile ilgili verimlilik sorunları var mı?
ypercubeᵀᴹ

1
@ypercube - Gördüğüm kadarıyla gruplandırırsanız, A.PK, A.some, A.other, A.columnsbunu karşılaştırmak zahmete girmez some, other, columns, sadece sözdizimi için gereklidir.
Martin Smith,

1
@datagod üzgünüm, hayır, herhangi bir boşluk sadece SSMS dev ekibi tarafından açıklanabildi. :-)
Aaron Bertrand

1
@Pacerier Üzgünüm, tamamen aynı fikirdeyim , ama belki detaylı bir şekilde girebilirsin.
Aaron Bertrand
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.