GROUP BY 문의 와일드 카드가 작동하지 않는 이유는 무엇입니까?


29

다음 SQL 문을 작동 시키려고하지만 구문 오류가 발생합니다.

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

여기서 A는 40 개의 열이있는 넓은 테이블이며 가능한 경우 GROUP BY 절에 각 열 이름을 나열하지 않으려 고합니다. 비슷한 쿼리를 실행 해야하는 테이블이 많으므로 저장 프로 시저를 작성해야합니다. 이것에 접근하는 가장 좋은 방법은 무엇입니까?

MS SQL Server 2008을 사용하고 있습니다.

답변:


32

GROUP BY A.* SQL에서는 허용되지 않습니다.

그룹화 한 다음 하위 쿼리를 사용하여 하위 쿼리를 사용하여이를 무시할 수 있습니다.

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 표준 에는 기능적으로 종속되어 SELECT있는 한 GROUP BY목록에 없는 열을 목록 에 허용 하는 기능이 있습니다. 해당 기능이 SQL-Server에서 구현 된 경우 쿼리는 다음과 같이 작성되었을 수 있습니다.

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

불행히도이 기능은 SQL-Server 2012 버전에서도 아직 구현되지 않았으며 내가 아는 한 다른 DBMS에서는 구현되지 않았습니다. MySQL이 있지만 부적절하게있는 MySQL을 제외하고 (부적절하게 : 위의 쿼리는 작동하지만 엔진은 기능 의존성을 검사하지 않으며 다른 잘못 작성된 쿼리는 잘못된 반 무작위 결과를 보여줍니다).

마찬가지로 @ 마크 바이어스는 코멘트에서 우리를 통보, PostgreSQL의 9.1 새로운 기능이 추가 된 이 목적을 위해 설계를. MySQL의 구현보다 더 제한적입니다.


표준의 해당 부분을 서면으로 구현하는 몇 가지 RDBMS를 언급 할 수 있습니까? 나는 알고있다, 예를 들어, 그 MySQL은 당신 (주어진 적절한 설정이)가 아닌 내에서 항목을 포함 할 수 GROUP BY에서 절 SELECT목록, 그러나 그것은 값이 (그래서 열 또는 표현식의 경우에서 오는 것이라고하는 행으로 정의되지 않은 잎 ISN은 ' 그룹화 표현식에 기능적으로 의존하지 않으면 그룹 내의 모든 행에서 올 있습니다).
Adam Robinson

@ 아담 : 아니요, 구현 된 RDBMS는 없습니다. 귀하의 의견에 따르면 MySQL에는 적합하지 않지만 적절하지 않습니다.
ypercubeᵀᴹ

알았어 나는이 사이트에서 질문에 대답하는 대부분의 사람들이 생각할 것보다 훨씬 적은 RDBMS에 대한 경험이 있었기 때문에 실제로 존재하는지 묻고 있었다.) 그러나 그것은 나의 의혹이었다.
Adam Robinson

3
"그리고 내가 아는 한 다른 DBMS에는 없습니다." PostgreSQL 9.1 은이 목적으로 설계된 새로운 기능을 추가했습니다 . MySQL의 구현보다 더 제한적입니다.
Mark Byers

@ MarkByers : thnx, 나는 몰랐습니다.
ypercubeᵀᴹ

24

@ypercube의 해결 방법 외에도 "typing"은 사용에 대한 변명이 아닙니다 SELECT *. 나는 이것에 대해 여기에 썼고 , 해결 방법으로 SELECT도 40과 같은 거대한 숫자가 있더라도 목록에 여전히 열 이름이 포함되어야 한다고 생각합니다 .

간단히 말해서 개체 탐색기에서 개체의 열 노드를 클릭하고 쿼리 창으로 끌어서 큰 목록을 입력하지 않아도됩니다. 스크린 샷은 뷰를 표시하지만 테이블에 대해서도 동일한 작업을 수행 할 수 있습니다.

여기에 이미지 설명을 입력하십시오

당신이 모든 이유에 대해 읽고 싶다면 당신이 항목을 몇 인치를 끌어의 노력이 거대한 수준에 자신을 복종한다, 내 게시물을 읽어 보시기 바랍니다 . :-)


PostgreSQL (EMS SQL Manager 사용)에서 뷰를 SELECT *다음과 같이 정의한 다음 뷰 정의에서 필드 목록을 복사합니다.
dezso

나는 SELECT *사용해서는 안된다는 것에 확실히 동의합니다 . GROUP BY그래도 사건이 궁금합니다 . @Aaron, Group By 목록에 40 개의 열이있을 때 효율성 문제가 있습니까?
ypercubeᵀᴹ

1
@ ypercube-내가 그룹화하면 A.PK, A.some, A.other, A.columns실제로 비교하는 것을 귀찮게하지 않는 한 이것을 some, other, columns구문에 필요합니다.
Martin Smith

1
@datagod 죄송합니다. SSMS 개발팀에서만 차이를 설명 할 수 있습니다. :-)
Aaron Bertrand

1
@Pacerier 죄송합니다. 전적으로 동의하지 않지만 정교 할 수 있습니다.
Aaron Bertrand
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.