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() 버튼을 클릭하여 작성 하시면 됩니다.