되지 않음을 가장 효율적으로, 또는 우아한하지만 작품!
데이터 설정 :
CREATE TABLE LookupTable (Customer int, Code nvarchar(1), OrderCol int)
CREATE TABLE DataTable (Customer int, Code nvarchar(1))
insert LookupTable values (12345,'A',1),(12345,'B',2),(12345,'C',3),(12345,'D',4),(12345,'E',5),(22222,'A',1),(22222,'B',2),(22222,'D',4),(22222,'E',5)
insert DataTable values (12345,'B'),(12345,'D'),(22222,'B'),(22222,'D')
select * from LookupTable
select * from DataTable
쿼리 :
;with LookupCte as (
SELECT *
, ROW_NUMBER() OVER (PARTITION BY Customer ORDER BY OrderCol ASC) AS LookUpOrder
FROM LookupTable
)
, DataCTE as (
SELECT dt.Customer
, dt.Code
, lu.LookUpOrder
, (lu.LookUpOrder - 1) AS OrderColNVe
, (lu.LookUpOrder + 1) AS OrderColPVe
, ROW_NUMBER() OVER (PARTITION BY dt.Customer ORDER BY dt.Code ASC) AS DataCteRowNumber
FROM DataTable dt
INNER JOIN LookupCte lu
ON lu.Customer = dt.Customer
AND lu.Code = dt.Code
)
, UnionCTE As (
SELECT d.Customer
, d.Code
, d.DataCteRowNumber
, 1 AS [CustomOrder]
FROM DataCTE d
UNION ALL
SELECT lt.Customer
, lt.Code
, d.DataCteRowNumber
, 2 AS [CustomOrder]
FROM DataCTE d
INNER JOIN LookupCte lt on lt.Customer = d.Customer
AND lt.LookUpOrder = d.OrderColNVe
UNION ALL
SELECT lt.Customer
, lt.Code
, d.DataCteRowNumber
, 3 AS [CustomOrder]
FROM DataCTE d
INNER JOIN LookupCte lt on lt.Customer = d.Customer
AND lt.LookUpOrder = d.OrderColPVe
)
SELECT u.Customer
, u.Code
FROM UnionCTE u
ORDER BY u.Customer, u.DataCteRowNumber, u.CustomOrder
을 제공합니다 :
Customer Code
----------- ----
12345 B
12345 A
12345 C
12345 D
12345 C
12345 E
22222 B
22222 A
22222 D
22222 D
22222 B
22222 E
(12 row(s) affected)
명확하게 설명 할 수 있습니까? 또한, 어떤 RDBMS –
RDBMS, 제발? 이것은 OLAP 함수가있는 구현에서 더 쉽습니다 ... 그리고 일치시킬 _actual_ 열을 나열하십시오. 그것은'ID'가 어디에서 오는지, Order 열 (사이드 노트 - SQL의 '예약어'다음에 테이블/컬럼의 이름을 지정하는 것은 권장하지 않음)입니다. –
Sql Server, 예제를 추가했습니다 – CaffGeek