database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
ㆍMS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MS-SQL Q&A 6929 게시물 읽기
No. 6929
쿼리문 문의 드립니다
작성자
축구소년(tjdrl0508)
작성일
2015-11-12 14:33
조회수
4,563

아래의 쿼리 중 5번째 줄 select top 20을 10으로 바꾸었을뿐인데 결과 값이 달라집니다

select top 10의 의미가 조회시 10건만 보여줘라라는 뜻이 아닌가요?

 

무슨이유로 이렇듯 결과 값이 달라졌을까요?

결과값은 원본으로 돌리면 아무것도 안나오고

수정본으로 돌리면 3건이 출력됩니다

 

--원본

Select Top 10 A.EmpGuid as GUID, C.DeptGuid as DeptGUID, TA_DB.dbo.fn_MakeDeptName

((SELECT DeptName FROM TA_DB.dbo.TB_MDEPTDATA D1 WHERE D1.DeptGUID = C.ParentDeptGuid ),C.DeptName) as DeptName,

TA_DB.DBO.FN_IPNUM2STR(USERIP) AS S_IP, A.EmpName, B.UserID, B.Type, B.AccessTime FROM TA_LOG.dbo.TB_WEBHISTORY

AS B JOIN TA_DB.dbo.TB_MEMPDATA AS A on A.EmpGuid=B.MemGuid left outer join TA_DB.dbo.TB_MDEPTDATA AS C on C.DeptGuid=A.DeptGuid

WHERE B.Guid NOT IN (Select Top 20 B.Guid FROM TA_LOG.dbo.TB_WEBHISTORY AS B JOIN TA_DB.dbo.TB_MEMPDATA AS A on A.EmpGuid=B.MemGuid

left outer join TA_DB.dbo.TB_MDEPTDATA AS C on C.DeptGuid=A.DeptGuid WHERE 1=1 and b.accountType=1 AND B.AccessTime >= '20151023 00:00'

AND B.AccessTime <= '20151023 23:59' ORDER BY AccessTime DESC, [type]) and b.accountType=1

AND B.AccessTime >= '20151023 00:00' AND B.AccessTime <= '20151023 23:59' ORDER BY AccessTime DESC, [type]

 

 

 

 

--수정

Select Top 10 A.EmpGuid as GUID, C.DeptGuid as DeptGUID, TA_DB.dbo.fn_MakeDeptName

((SELECT DeptName FROM TA_DB.dbo.TB_MDEPTDATA D1 WHERE D1.DeptGUID = C.ParentDeptGuid ),C.DeptName) as DeptName,

TA_DB.DBO.FN_IPNUM2STR(USERIP) AS S_IP, A.EmpName, B.UserID, B.Type, B.AccessTime FROM TA_LOG.dbo.TB_WEBHISTORY

AS B JOIN TA_DB.dbo.TB_MEMPDATA AS A on A.EmpGuid=B.MemGuid left outer join TA_DB.dbo.TB_MDEPTDATA AS C on C.DeptGuid=A.DeptGuid

WHERE B.Guid NOT IN (Select Top 10 B.Guid FROM TA_LOG.dbo.TB_WEBHISTORY AS B JOIN TA_DB.dbo.TB_MEMPDATA AS A on A.EmpGuid=B.MemGuid

left outer join TA_DB.dbo.TB_MDEPTDATA AS C on C.DeptGuid=A.DeptGuid WHERE 1=1 and b.accountType=1 AND B.AccessTime >= '20151023 00:00'

AND B.AccessTime <= '20151023 23:59' ORDER BY AccessTime DESC, [type]) and b.accountType=1

AND B.AccessTime >= '20151023 00:00' AND B.AccessTime <= '20151023 23:59' ORDER BY AccessTime DESC, [type]

 

 

감사합니다

 

이 글에 대한 댓글이 총 1건 있습니다.

원본은 Top 20 에 들지 못한 것들 중 Top 10 을 가져오는거죠. ==> 21 ~ 30
수정은 Top 10 에 들지 못한 것들 중 Top 10 을 가져오는거죠. ==> 11 ~ 20


NOT IN 사용은 비효율적이니 다른 방법을 이용하세요.
1. MSSQL 2012 이상이라면 Offset ~ Fetch 구문 이용하시구요
    SELECT *
      FROM ...
     ORDER BY AccessTime DESC, [type]
     OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY
    ;
2. 이하 버전이라면 ROW_NUMBER() OVER() 를 이용하세요.
    SELECT *
      FROM (SELECT a.*
                 , ROW_NUMBER() OVER(ORDER BY AccessTime DESC, [type]) rn
              FROM (...) a
            ) a
     WHERE rn BETWEEN 11 AND 20
    ;
3. 10등 안에 못드는 것중 10등을 찾지 마시고
   - 20등 안에 드는 것을 가져와 거꾸로 정렬하여 10개 가져온뒤 다시 정렬하세요.
    SELECT *
      FROM (SELECT TOP 10 *
              FROM (SELECT TOP 20 *
                      FROM ...
                     ORDER BY AccessTime DESC, [type]
                   ) a
             ORDER BY AccessTime, [type] DESC
            ) a
     ORDER BY AccessTime DESC, [type]
    ;

마농(manon94)님이 2015-11-12 16:53에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
6932ms sql 선수수익 문제 질문합니다! [1]
황유진
2015-11-17
4552
6931이후값 갖고 오는 방법이 있을까요. [2]
빨간운동화
2015-11-17
4250
6930쿼리 병합에 대한 문의 드립니다. [1]
으라차차
2015-11-16
4430
6929쿼리문 문의 드립니다 [1]
축구소년
2015-11-12
4563
6927웹에서 프로시저 실행하면 시간초과. [2]
조성배
2015-11-09
4481
6926일자별 통계쿼리
dks 안순형
2015-11-06
4422
6924일주일간 매일 합을 구해야 하는데요... [2]
정지현
2015-11-03
4842
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.050초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다