왜 SQL이 내 그룹 별 조항에서 내의 선택 조항에서 응집되지 않은 모든 필드를 반복하도록 강요하는 이유는 무엇입니까? [닫은

StackOverflow https://stackoverflow.com/questions/416625

  •  03-07-2019
  •  | 
  •  

문제

이것은 오랫동안 나를 괴롭 혔습니다.

시간의 99%, 절에 의한 그룹은 골재 함수를 빼고 선택 조항의 정확한 사본입니다 (최대, 합 등).
이것은 자신을 반복하지 않는 원칙을 깨뜨립니다.

항해에 의한 그룹에는 언제 집계 함수를 뺀 SELECT 절의 정확한 사본을 포함 할 수 있습니까?

편집하다

일부 구현으로 일부 구현은 선택보다 그룹에 다른 필드를 가질 수 있다는 것을 알고 있습니다 (따라서 100%가 아닌 99%). 그러나 그것은 매우 사소한 예외입니까?
다른 필드를 사용하면 누군가 반품해야 할 사항을 설명 할 수 있습니까?

감사.

도움이 되었습니까?

해결책

나는 당신에게 동의하는 경향이 있습니다 - 이것은 SQL이 우리에게 일부 타이핑을 저장하기 위해 약간 더 똑똑한 기본값을 가져야하는 많은 경우 중 하나입니다. 예를 들어, 이것이 합법적인지 상상해보십시오.

Select ClientName, InvoiceAmount, Sum(PaymentAmount) Group By *

여기서 "*"는 "모든 비 응집 필드"를 의미합니다. 모두가 그것이 어떻게 작동하는지 알고 있다면 혼란이 없을 것입니다. 까다로운 일을하고 싶다면 특정 필드 목록에서 하위 할 수 있지만 Splat은 "모든 'em"을 의미합니다 (이 맥락에서 모든 의미에서 모든 것을 의미합니다. 가능한 ones).

"*"는 선택 조항과는 다른 것을 의미하므로 다른 캐릭터가 더 잘 작동 할 수 있습니다.

Select ClientName, InvoiceAmount, Sum(PaymentAmount) Group By !

SQL이 가능한 한 설득력이없는 곳과 같은 다른 영역이 있습니다. 그러나이 시점에서 아마도 그렇게 많은 큰 변화를 만들기에는 너무 굳건 할 것입니다.

다른 팁

그것들은 두 가지 다른 것이기 때문에 선택 조항에없는 항목별로 그룹화 할 수 있습니다.

편집하다:

또한 그 가정을 만드는 것이 안전합니까?

SQL 문이 있습니다

Select ClientName, InvAmt, Sum(PayAmt) as PayTot

서버가 ClientName 및 InvoIceamount별로 그룹화하고 싶다고 가정하는 것이 "정확한"입니까? 나는 개인적 으로이 코드를 갖는 것이 더 안전하다고 생각합니다.

Select ClientName, InvAmt, Sum(PayAmt) as PayTot
Group By ClientName

오류를 던져 코드를

Select ClientName, Sum(InvAmt) as InvTot, Sum(PayAmt) as PayTot
Group By ClientName

나는 우리가 곧 더 포괄적 인 것을 볼 수 있기를 바랍니다. 주제에 대한 SQL 역사 수업은 유용하고 유익합니다. 누구나? 누구나? 버셀?

그 동안 다음을 볼 수 있습니다.

SQL은 적어도 문서화 된 한 건조 원리를 선행합니다. 실용적인 프로그래머.

모든 DBS가 전체 목록을 요구하는 것은 아닙니다. 예를 들어 Sybase는 다음과 같은 쿼리를 행복하게 실행합니다.

SELECT a, b, COUNT(*)
FROM some_table
GROUP BY a

... (적어도 실수로 그런 괴물을 운영 할 때마다) 종종 공황에 빠진 요청이 빠르게 발생하는 거대한 부주의 한 레코드로 이어져서 DBA가 서버를 튀기라고 간청합니다. 그 결과는 일종의 부분 데카르트 제품이지만 SYBase 부분에서 SQL 표준을 올바르게 구현하지 못하는 것이 대부분 실패 할 수 있다고 생각합니다.

아마도 우리는 속기 양식이 필요할 것입니다 - GroupSelect라고 부릅니다.

GroupSelect Field1, Field2, sum(Field3) From SomeTable Where (X = "3")

이런 식으로 구문 분석기는 집계 기능을 제거하는 경우에만 오류 만 던질 필요가 있습니다.

좋은 이유는 모든 열을 지정하지 않은 경우에 더 자주 결과를 얻지 못하기 때문입니다. 세 개의 열이 있다고 가정 해 col1, col2 그리고 col3.

데이터가 다음과 같이 보인다고 가정합니다.

Col1  Col2 Col3
a      b    1
a      c    1
b      b    2
a      b    3

select col1, col2, sum(col3) from mytable group by col1, col2
다음 결과를 제공합니다.

Col1  Col2 Col3
a      b    4
a      c    1
b      b    2

어떻게 해석 할 것인가
select col1, col2, sum(col3) from mytable group by col1

내 추측이 될 것입니다

Col1  Col2 Col3
a      b    5
a      c    5
b      b    2

이것들은 분명히 나쁜 결과입니다. 물론 쿼리가 더 복잡하고 더 많이 조인할수록 쿼리가 올바른 결과를 반환하거나 프로그래머가 잘못되었는지 알 수있을 가능성이 줄어 듭니다.

개인적으로 나는 기쁘다 group by 필드가 필요합니다.

나는 모두 그룹, 그룹에 의해 그룹 또는 비슷한 것들에 동의합니다. 원래 게시물에서 언급했듯이 모든 비 응집 열/표현으로 그룹화하려는 경우 99% (아마도 더 많은).

그러나 다음은 뒤로 호환성있는 이유로 열별 그룹이 필요한 예입니다.

SELECT 
  MIN(COUNT(*)) min_same_combination_cnt, 
  MAX(COUNT(*)) max_same_comb_cnt, 
  AVG(COUNT(*)) avg_same_comb_cnt, 
  SUM(COUNT(*)) total_records,
  COUNT(COUNT(*)) distinct_combinations_cnt
FROM <some table>
GROUP BY <list of columns>

이것은 Oracle에서 작동합니다. 열의 선택성을 추정하는 데 사용합니다. 의 그룹은 내부 골재 기능에 적용됩니다. 그런 다음 외부 집계가 적용됩니다.

SQL 표준에 대한 이러한 개선에 대한 제안을 제시하는 것이 좋을 것입니다. 나는 그것이 어떻게 작동하는지 모른다.

사실, 그것은 시간의 100%가되지 않습니까? 선택에 그룹에없는 (응집료) 열을 가질 수있는 경우가 있습니까?

그래도 답이 없습니다. 그것은 확실히 언어의 어색한 순간처럼 보입니다.

나는 반복이 약간 성가신 것이라는 OP의 견해를 공유합니다. 특히 비 응집 필드에 IFS 및 기능과 같은 정교한 진술이 포함되어있는 경우, 많은 다른 것들. 절에 의해 그룹에 약간의 속기가있을 수 있다면 좋을 것입니다 - 최소한 열 별칭. 숫자 별 열을 참조하는 것은 아마도 고유 한 문제가있는 또 다른 옵션 일 수 있습니다.

예를 들어 그룹화 된 모든 행의 하나의 ID를 추출 해야하는 상황과 양의 합계가있을 수 있습니다. 이 경우 이름으로 그룹화하고 그룹화되지 않은 ID를 남겨 둡니다. Sqlite는 이런 식으로 작동하는 것 같습니다.

결과적으로 그룹 전체의 튜플 그룹에 대한 단일 튜플로 그룹에 의해 그룹이므로, 다른 비 그룹은 속성에 의한 다른 비 그룹을 집계 함수로만 사용해야합니다. u select에서 속성별로 그룹을 추가하면 SQL은 해당 그룹에서 어떤 값을 선택할지 결정할 수 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top