본문 바로가기

DBMS/SQL Server

[SQL Server] UNION을 ORDER BY와 같이 사용할 때 원하는 값 얻기

 

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

 

 

원하는 결과가 나왔음을 확인할 수 있다.