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.