by FuLLy [SQL Query] [2019.03.11 14:42:40]
SELECT
B.ID
, (
TOP
1 A.ID
FROM
A
WHERE
A.PHONE = B.PHONE
AND
A.ID <> B.ID
A.REGDT
BETWEEN
B.
DATE
-365
ORDER
BY
DESC
)
B
위와같이 형태의 스칼라 서브쿼리가 있는데, 이 쿼리를 인라인뷰로 바꾸려고하는데 어떻게 해야할지 어렵네요..
mssql입니다..
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
하면 될 거 같은뎀...
TOP 1이 오라클로 치면 ROWNUM = 1 해서 한건만 가져오는건데 그냥 조인 해서 조건만 걸면 스칼라서브쿼리에서 조인이안되면 NULL 처리되는데 위와 같은방식으로하면 조인안되는ROW가 아에 발생안하지않나요..?
느훼훼님.
서브쿼리를 JOIN 으로 변환시에는 OUTER JOIN 으로 바꾸는게 더 정확할것 같네요.
데이터가 빠질경우 안나올수 있어요.
*
(
b.id
, b.phone
, a.id a_id
, ROW_NUMBER() OVER(PARTITION
b.id, b.phone
a.regdt
, a.id) rn
b
LEFT
OUTER
JOIN
a
ON
a.phone = b.phone
a.id <> b.id
b.
date
- 365
) c
rn = 1
;