2011-08-05 39 views
1

我需要创建映射两个表值的表。没有可用于连接这些表的键,但可以保证这两个表中的行数保证相同,并且一个中的最低ID值映射到另一个中最低的值。实际ID本身在两个表中是不同的将SQL从两个表中按升序插入到表中

有没有办法在SQL Server中执行此操作。

感谢

回答

6

在SQL Server 2005+:

WITH Table1Ranked AS (
    SELECT 
    ID, 
    rn = ROW_NUMBER() OVER (ORDER BY ID) 
    FROM Table1 
), 
Table2Ranked AS (
    SELECT 
    ID, 
    rn = ROW_NUMBER() OVER (ORDER BY ID) 
    FROM Table2 
) 
INSERT INTO MapTable (Table1ID, Table2ID) 
SELECT t1.ID, t2.ID 
FROM Table1Ranked t1 
    INNER JOIN Table2Ranked t2 ON t1.rn = t2.rn 
2

您可以使用DENSE_RANK函数在你的情况。

例如

CREATE TABLE Table1 
(
    ID  INT, 
    NAME VARCHAR(10) 
) 

CREATE TABLE Table2 
(
    ID  INT, 
    NAME VARCHAR(10) 
) 

INSERT INTO Table1 
SELECT 1, 'abc' 
UNION 
SELECT 2, 'def' 

INSERT INTO Table2 
SELECT 3, 'abc' 
UNION 
SELECT 4, 'def' 

SELECT tbl1.ID AS [ID1] 
    , tbl1.NAME AS [Name1] 
    , tbl2.ID AS [ID2] 
    , tbl2.NAME AS [Name2] 
FROM 
(
    SELECT ID, NAME 
     , DENSE_RANK() OVER (ORDER BY ID) AS [Rank] 
    FROM Table1 
) as tbl1 
    INNER JOIN 
    (
     SELECT ID, NAME 
      , DENSE_RANK() OVER (ORDER BY ID) AS [Rank] 
     FROM Table2 
    ) as tbl2 ON tbl1.[Rank] = tbl2.[Rank] 

它可能会帮助你。

0

如果(并且只有)你知道两组ID均匀地上升,例如,都从一定的数字开始,总是增加1,然后只选择@offset =最低的一个减去其他的最低。然后只需使用偏移量即可加入。