스칼라서브쿼리를 인라인뷰로 바꾸는데 질문이요.. 0 4 1,997

by FuLLy [SQL Query] [2019.03.11 14:42:40]


SELECT B.ID
	 , (SELECT TOP 1 A.ID
		  FROM A
		 WHERE A.PHONE = B.PHONE
		   AND A.ID <> B.ID
		   AND A.REGDT BETWEEN B.DATE-365 AND B.DATE
		 ORDER BY A.REGDT DESC
		)
  FROM B

위와같이 형태의 스칼라 서브쿼리가 있는데, 이 쿼리를 인라인뷰로 바꾸려고하는데 어떻게 해야할지 어렵네요..

mssql입니다..

by 느훼훼 [2019.03.11 14:55:36]

MS-SQL을 해보질 못해서;;  오라클DB로 치면 아래와 같을거 같네요.

일단 스칼라서브쿼리 SELECT 절에 TOP 1 A.ID가 뭔지 모르겠지만 그냥 A.ID라고 치면 ㅋ

SELECT TBL1.ID

          TBL2.ID

 FROM  B TBL1,

           A TBL2

 WHERE TBL1.PHONE = TBL2.PHON

     AND TBL1.ID <> TBL2.ID

     AND TBL2.REGDT BETWEEN TBL1.DATE-365 AND TBL1.DATE

ORDER BY TBL2.REGDT DESC

하면 될 거 같은뎀...


by FuLLy [2019.03.11 15:04:41]

TOP 1이 오라클로 치면 ROWNUM  = 1 해서 한건만 가져오는건데 그냥 조인 해서 조건만 걸면 스칼라서브쿼리에서 조인이안되면 NULL 처리되는데 위와 같은방식으로하면 조인안되는ROW가 아에 발생안하지않나요..?


by 우리집아찌 [2019.03.11 17:14:59]

느훼훼님.

서브쿼리를 JOIN 으로 변환시에는 OUTER JOIN 으로 바꾸는게 더 정확할것 같네요.

데이터가 빠질경우 안나올수 있어요.


by 마농 [2019.03.12 08:48:00]
SELECT *
  FROM (SELECT b.id
             , b.phone
             , a.id a_id
             , ROW_NUMBER() OVER(PARTITION BY b.id, b.phone ORDER BY a.regdt DESC, a.id) rn
          FROM b
          LEFT OUTER JOIN a
            ON a.phone = b.phone
           AND a.id <> b.id
           AND a.regdt BETWEEN b.date - 365 AND b.date
        ) c
 WHERE rn = 1
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입