Sql server 将一个表中的数据连接到另一个表中的有序值之间

Sql server 将一个表中的数据连接到另一个表中的有序值之间,sql-server,tsql,Sql Server,Tsql,我有两个数字表。我需要按顺序加入他们。我正在寻找最有效的方法来做到这一点。事实上我正在研究日期,但为了简单起见,我会用数字来解释 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和=6=我的当前行,但= a.data AND x.data < ISNULL(b.data,999999999)) z

我有两个数字表。我需要按顺序加入他们。我正在寻找最有效的方法来做到这一点。事实上我正在研究日期,但为了简单起见,我会用数字来解释

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等

我想要一个这样的结果

1 1.1    
1 2.3    
3 4.5    
6 6.5    
8 8.8    
8 8.9
因此,基本上我希望值>=我的当前行,但<然后是更高的行

我需要这是非常有效的,因为它将在使用日期而不是数字的大型数据集上运行

试试这个

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 

这将起作用,但需要进行性能测试:

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)
在这里表现良好:


使用一些示例数据创建SQLFIDLE
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)
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