>데이터 베이스 >MySQL 튜토리얼 >SQL GROUP BY 및 ORDER BY 절의 명명 충돌을 해결하는 방법은 무엇입니까?

SQL GROUP BY 및 ORDER BY 절의 명명 충돌을 해결하는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2025-01-10 14:59:44179검색

How to Resolve Naming Conflicts in SQL GROUP BY and ORDER BY Clauses?

SQL GROUP BYORDER BY 절 명명 충돌: 해결책

원래 쿼리에서는 계산된 CASE 표현식 열과 소스 열(attempt.result) 간의 이름 충돌로 인해 하드웨어 모델, 결과 유형 및 사례별로 데이터를 그룹화할 때 문제가 발생합니다. 이로 인해 동일한 유형 및 케이스 조합에 대한 여러 행이 생성됩니다.

해결책은 GROUP BY 절 내에서 소스 열 이름을 직접 사용하지 않는 것입니다. 다음은 두 가지 효과적인 접근 방식입니다.

방법 1: CASE 표현식으로 직접 그룹화:

attempt.result으로 그룹화하는 대신 CASE 표현식 자체로 그룹화:

<code class="language-sql">GROUP BY model.name, attempt.type, CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END</code>

CASE문의 계산 결과를 바탕으로 데이터를 직접 그룹화하여 모호성을 제거합니다.

방법 2: 열 별칭 사용:

CASE 표현식의 출력 열에 별칭 할당:

<code class="language-sql">SELECT ..., CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END AS result1
GROUP BY model.name, attempt.type, result1</code>

별칭 result1은 계산된 열과 원본 열을 명확하게 구분하여 충돌을 해결합니다. 이 경우 ORDER BY은 별칭 열 이름(result1)을 우선시합니다.

모범 사례: 위치 참조

이름 충돌을 완전히 방지하려면 GROUP BYORDER BY 절 내에서 위치 참조를 활용하세요. 이 접근 방식은 특히 복잡한 쿼리에서 오류가 발생할 가능성이 적고 쿼리 가독성을 향상시킵니다. 아래 예에서는 단순화되고 다시 작성된 쿼리 내에서 이 기술을 보여줍니다.

<code class="language-sql">SELECT m.name, a.type, CASE WHEN a.result = 0 THEN 0 ELSE 1 END AS result, CURRENT_DATE - 1 AS day, count(*) AS ct
FROM attempt a
JOIN prod_hw_id p USING (hard_id)
JOIN model m USING (model_id)
WHERE ts >= '2013-11-06 00:00:00' AND ts < CURRENT_DATE  --Corrected the incomplete WHERE clause
GROUP BY 1, 2, 3  -- Positional references for model.name, a.type, result
ORDER BY 1, 2, 3  -- Positional references for model.name, a.type, result</code>

이 수정된 쿼리는 더 간결하며 잠재적인 이름 충돌을 방지합니다. WHERE 절의 완전성을 항상 확인하세요. 원본이 미완성이라 위에서 수정했습니다.

위 내용은 SQL GROUP BY 및 ORDER BY 절의 명명 충돌을 해결하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.