2014-11-20 2 views
2

두 개의 테이블이 있습니다. 나는 그들을 순차적으로 가입시켜야한다. 이 작업을 수행하는 가장 효율적인 방법을 찾고 있습니다. 사실은. 나는 날짜를 가지고 일하고 있지만 단순함을 위해 숫자로 설명 할 것이다.다른 테이블의 정렬 된 값 사이에서 한 테이블의 데이터 조인

TABLE 1 has data 1, 3, 6, 8 
TABLE 2 has data 1.1, 2.3, 4.5, 6.5, 8.8, 8.9 

내가 원하는 값> = 1, ... < 3> = 3 < 6 ...> = 6 < 8 등

I 원하는

같은 결과
1 1.1  
1 2.3  
3 4.5  
6 6.5  
8 8.8  
8 8.9 

그래서, 기본적으로 값> = 내 현재 행을 원하지만 < 다음 높은 행.

숫자 대신 숫자를 사용하는 대형 데이터 세트에서 실행되므로 매우 효율적이어야합니다.

+0

일부 샘플 데이터로 sqlfiddle 만들기 – Mihai

답변

2

시도해보십시오.

create TABLE #table1 (data int) 
insert #table1 
values(1), (3),(6), (8) 

create TABLE #table2 (data numeric(6,2)) 
insert #table2 values 
(1.1), (2.3), (4.5), (6.5), (8.8), (8.9) 


SELECT Max(col1)col1, 
     col2 
FROM (SELECT CASE 
       WHEN a.data < b.data THEN a.data 
       END col1, 
       b.data col2 
     FROM #table1 a 
       CROSS JOIN #table2 b) a 
WHERE col1 IS NOT NULL 
GROUP BY col2 

OUTPUT

+-----+-----+ 
|col1 | col2| 
+-----+-----+ 
|1 | 1.10| 
|1 | 2.30| 
|3 | 4.50| 
|6 | 6.50| 
|8 | 8.80| 
|8 | 8.90| 
+-----+-----+ 
1

이 작동하지만 성능 테스트를 필요로합니다 :

SELECT 
    T1.DATA, 
    T2.DATA 
FROM 
    Table1 T1 
    JOIN Table2 T2 ON T2.Data >= T1.DATA AND 
        T2.Data < ISNULL(
            (
             SELECT TOP 1 
             TT1.Data 
             FROM 
             Table1 TT1 
             WHERE 
             TT1.Data > T1.Data 
             ORDER BY 
             TT1.DATA 
            ), T2.Data + 1) 
1
여기

좋은 성능 :

 
CREATE TABLE t1(data int) 
CREATE TABLE t2(data numeric(18,2))

INSERT INTO t1 VALUES(1), (3),(6), (8)

INSERT INTO t2 VALUES (1.1), (2.3), (4.5), (6.5), (8.8), (8.9)

WITH CTE AS (SELECT ROW_NUMBER() OVER (ORDER BY data) AS rn, data FROM t1)

SELECT a.data,z.data FROM CTE a LEFT JOIN CTE b ON a.rn+1 = b.rn CROSS APPLY (SELECT * FROM t2 x WHERE x.data >= a.data AND x.data < ISNULL(b.data,999999999)) z

관련 문제