SQL GROUP BY
및 ORDER 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 BY
및 ORDER 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!