UNION, UNION ALL을 ORDER BY와 같이 사용할 때 원하는 결과를 얻지 못할 수 있다.
테스트를 위해 테이블을 생성하고 데이터를 삽입하였다.
CREATE TABLE dbo.TEST_TBL ( ID INT IDENTITY(1,1) , NAME CHAR(8) , AGE TINYINT , GENDER CHAR(2) , REGDATE DATETIME ) GO
INSERT INTO dbo.TEST_TBL VALUES ('김남자', 30, '남', GETDATE()) INSERT INTO dbo.TEST_TBL VALUES ('김여자', 29, '여', GETDATE()) INSERT INTO dbo.TEST_TBL VALUES ('이남자', 35, '남', GETDATE()+1) INSERT INTO dbo.TEST_TBL VALUES ('김여자', 32, '여', GETDATE()+1) INSERT INTO dbo.TEST_TBL VALUES ('박남자', 25, '남', GETDATE()+2) INSERT INTO dbo.TEST_TBL VALUES ('박여자', 37, '여', GETDATE()+2) GO
SELECT * FROM dbo.TEST_TBL GO |
아이디, 이름, 나이, 성별, 등록일자가 저장되어 있는 테이블을 조회한 결과이다.
등록일자가 가장 최신인 남, 여 한명씩 보여주려면 어떻게 해야할까.
TOP 1로 UNION을 이용해서 보여줄 수 있을 것이다.
SELECT TOP 1 NAME, AGE, GENDER, REGDATE FROM dbo.TEST_TBL WHERE GENDER = '남' ORDER BY REGDATE DESC
UNION ALL
SELECT TOP 1 NAME, AGE, GENDER, REGDATE FROM dbo.TEST_TBL WHERE GENDER = '여' ORDER BY REGDATE DESC GO |
남, 여 각각 등록일자가 최신인 1명씩을 구해서 UNION ALL을 하였다.
원하는 결과는 나오지 않고 오류 메시지가 나타난다.
UNION 을 사용할 때 위에 쿼리에서는 ORDER BY 절을 사용할 수 없다.
이번에는 위에 쿼리의 ORDER BY를 주석처리하고 실행하였다.
SELECT TOP 1 NAME, AGE, GENDER, REGDATE FROM dbo.TEST_TBL WHERE GENDER = '남' -- ORDER BY REGDATE DESC
UNION ALL
SELECT TOP 1 NAME, AGE, GENDER, REGDATE FROM dbo.TEST_TBL WHERE GENDER = '여' ORDER BY REGDATE DESC GO |
이번에는 오류는 나타나지 않았으나 원하는 결과 값이 나오지 않았다.
등록일자가 최신인 남, 여가 나오지 않았다.
서브쿼리를 이용하여 원하는 결과를 얻을 수 있다.
SELECT NAME, AGE, GENDER, REGDATE FROM ( SELECT TOP 1 NAME, AGE, GENDER, REGDATE FROM dbo.TEST_TBL WHERE GENDER = '남' ORDER BY REGDATE DESC ) AS A
UNION ALL
SELECT NAME, AGE, GENDER, REGDATE FROM ( SELECT TOP 1 NAME, AGE, GENDER, REGDATE FROM dbo.TEST_TBL WHERE GENDER = '여' ORDER BY REGDATE DESC ) AS B GO |
원하는 결과가 나왔음을 확인할 수 있다.
'DBMS > SQL Server' 카테고리의 다른 글
[SQL Server] UPDATE 절 사용시 FROM 절, JOIN 사용하기 (0) | 2014.04.18 |
---|---|
[SQL Server] RPC에 대해 구성되지 않았습니다. (0) | 2014.04.14 |
[SQL Server] 테이블 단위 백업 (5) | 2014.02.05 |
[SQL Server] TOP 절에 변수 사용하기 (0) | 2014.02.04 |
[SQL Server] SET NOCOUNT ON (0) | 2014.02.03 |