작성
·
406
0
SELECT *
FROM Functions
WHERE x = y
GROUP BY x
HAVING COUNT(x) = 2
UNION
SELECT p1.x, p1.y
FROM Functions AS p1
INNER JOIN Functions AS p2 ON (p1.x = p2.y AND p2.x = p1.y)
WHERE p1.x < p1.y
ORDER BY x
처음에 ORDER BY p1.x으로 작성했었는데 오류가 나더라고요. UNION 위에 작성한 쿼리를 Alias 없이 작성해서 안 되는 거죠..?
이렇게 Alias가 없는 쿼리와 있는 쿼리를 같이 쓸 때는 ORDER BY 뒤에 Alias를 사용하지 않는 컬럼명을 붙여준다고 생각하면 맞을까요?
답변 1
2
두 번째 쿼리의 select 절에서 테이블명(p1)을 붙인 이유는, inner join을 통해 p1과 p2가 합쳐졌는데 두 테이블에 동일한 이름(x, y)을 가진 컬럼이 있기 때문에 그냥 x만 쓰면 p1의 x 컬럼을 가져오라는 건지, p2의 x 컬럼을 가져오라는 건지 구분이 되지 않기 때문입니다.
위치를 정확히 명시해 준 것일 뿐이지, 컬럼 이름 자체가 p1.x 인 것이 아닙니다. 컬럼명은 그냥 x, y입니다.
그리고 union을 통해 첫 번째 쿼리의 output과 합쳐져 x, y 컬럼을 가진 새로운 테이블이 만들어 집니다.
order by는 이 새로운 테이블에 정렬 명령을 하는 것인데, 여기에는 더 이상 p1이라는 테이블이 없으므로 p1.x라고 쓰면 인식하지 못합니다.