집 >데이터 베이스 >MySQL 튜토리얼 >SQL GROUP BY 및 ORDER BY 절에서 이름 지정 충돌을 방지하는 방법은 무엇입니까?
SQL GROUP BY 및 ORDER BY 절에서 이름 지정 충돌을 방지하기 위한 팁
여러 열을 조합하고 정렬하는 SQL 쿼리에서는 출력 열 이름과 소스 열 이름 간에 이름 지정 차이가 있을 수 있으므로 GROUP BY
및 ORDER BY
절에 사용되는 열 이름을 신중하게 고려해야 합니다. SQL 언어 충돌이 발생했습니다.
예를 들어 쿼리의 목표는 하드웨어 모델(이름), 시도 유형(유형) 및 이진 결과(0 또는 1로 단순화된 결과)별로 데이터를 그룹화하는 것입니다. 그러나 원하는 출력은 유형과 케이스의 고유한 조합을 사용하여 각 모델에 대해 하나의 행만 표시하는 것입니다.
GROUP BY
및 CASE
표현식 모두에서 소스 열 이름 result
을 사용하면 문제가 발생합니다. SQL 표준에 따르면 이 경우 GROUP BY
는 result
을 소스 열 이름으로 해석하고 ORDER BY
을 출력 열 이름으로 해석합니다.
이 충돌을 해결하고 예상되는 결과를 얻으려면 다음과 같은 여러 가지 방법이 있습니다.
CASE
표현식에 별칭을 추가하여 소스 열 이름과 다른지 확인하세요. 예: <code class="language-sql">... CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END AS result1 ... GROUP BY model.name, attempt.type, result1 ...</code>
<code class="language-sql">... GROUP BY 1, 2, 3 ...</code>
GROUP BY
에 포함될 필요는 없지만 명확성을 위해 결과에 영향을 주지 않고 추가할 수 있습니다. 위치 참조를 사용하여 수정된 쿼리는 다음과 같습니다.
<code class="language-sql">SELECT model.name , attempt.type , CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END AS result , CURRENT_DATE - 1 AS day , count(*) AS ct FROM attempt JOIN prod_hw_id USING (hard_id) JOIN model USING (model_id) WHERE ts >= '2013-11-06 00:00:00' AND ts < '2013-11-07 00:00:00' GROUP BY 1, 2, 3 ORDER BY 1, 2, 3;</code>
올바른 열 이름을 확인하고 위치 참조를 사용함으로써 쿼리는 이제 예상대로 데이터를 집계하여 모델, 유형 및 결과의 각 고유 조합에 대해 하나의 결과 행만 제공합니다.
위 내용은 SQL GROUP BY 및 ORDER BY 절에서 이름 지정 충돌을 방지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!