• 카테고리

    질문 & 답변
  • 세부 분야

    데이터 분석

  • 해결 여부

    미해결

UNION 해커랭크 문제풀이 질문

20.10.16 10:30 작성 조회수 205

3

Symmetric Pairs에서

UNION 후 마지막에 ORDER BY X를 해주는데,

ORDER BY Functions.X로 하면 에러가 나는 이유는 무엇인가요?

제가 작성 한 SQL은 아래와 같습니다

SELECT Functions.X
     , Functions.Y
FROM Functions
WHERE Functions.X = Functions.Y
GROUP BY Functions.X, Functions.Y
HAVING COUNT(*) = 2

UNION

SELECT Functions.X
     , Functions.Y
FROM Functions
    INNER JOIN Functions as CompareT ON Functions.X = CompareT.Y AND Functions.Y = CompareT.X
WHERE Functions.X < Functions.Y
GROUP BY Functions.X, Functions.Y
ORDER BY Functions.X

답변 2

·

답변을 작성해보세요.

3

안녕하세요 으아니동동님

마지막 줄에 사용하신 ORDER BY는 UNION으로 합쳐진 테이블에 적용되는 명령어입니다. UNION을 이용하여 새롭게 만들어진 테이블은 Functions와 별개의 테이블이기 때문에 Fucntions 를 붙여주시면 에러가 납니다.

아래 쿼리 참고해주세요.

(SELECT Functions.X
     , Functions.Y
FROM Functions
WHERE Functions.X = Functions.Y
GROUP BY Functions.X, Functions.Y
HAVING COUNT(*) = 2

UNION

SELECT Functions.X
     , Functions.Y
FROM Functions
    INNER JOIN Functions as CompareT ON Functions.X = CompareT.Y AND Functions.Y = CompareT.X
WHERE Functions.X < Functions.Y
GROUP BY Functions.X, Functions.Y)

ORDER BY X

UNION으로 합쳐진 테이블에 별칭을 붙이고 싶으실 경우 아래 쿼리를 참고해주시면 됩니다.
이 경우에는 union_table이라는 별칭을 사용하여 ORDER BY에서 테이블 조회가 가능합니다.

(SELECT Functions.X
     , Functions.Y
FROM Functions
WHERE Functions.X = Functions.Y
GROUP BY Functions.X, Functions.Y
HAVING COUNT(*) = 2

UNION

SELECT Functions.X
     , Functions.Y
FROM Functions
    INNER JOIN Functions as CompareT ON Functions.X = CompareT.Y AND Functions.Y = CompareT.X
WHERE Functions.X < Functions.Y
GROUP BY Functions.X, Functions.Y) AS union_table

ORDER BY union_table.X

궁금증이 해결되셨길 바랍니다.

감사합니다.

0

저도 동일한 질문인데 궁금증이 아직 해소되지 않아 여기에 댓글로 남깁니다! UNION으로 합쳐져 새롭게 만들어진 테이블에 ORDER BY가 적용된다고 하셨는데, 그럼 새롭게 만들어진 테이블의 컬럼이 X, Y로 되어있는걸까요? 컬럼명이 표기되지 않아 결과값을 모르겠는데 컬럼명이 X,Y로 자동으로 된걸까요? SELECT 이후에 별도 별칭을 하지 않아 1번째 테이블은 X, Y로 컬럼명이 되지만 2번째 테이블은 f1.x, f1.y 으로 된 것 아닌가요?

SELECT X, Y
FROM functions 
WHERE X = Y
GROUP BY X, Y
HAVING COUNT(*) = 2

UNION

SELECT f1.x, f1.y
FROM functions AS f1
     INNER JOIN functions AS f2 ON f1.X = f2.Y AND f1.y = f2.X
WHERE f1.x < f1.y
ORDER BY X