我需要创建一个映射两个表值的表。没有可用于连接这些表的键,但保证这两个表中的行数保证相同,并且一个中的最低ID值映射到其他表中的最低值一直到最高值。两个表中的实际ID本身会有所不同
有没有办法在SQL Server中执行此操作。
由于
答案 0 :(得分: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
答案 1 :(得分:2)
你可以在你的情况下使用Dense_Rank功能。
e.g。
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]
它可以帮助你。
答案 2 :(得分:0)
如果(并且仅当)您知道两组ID均匀上升,例如两者都以一定的数字开始并且总是上升1,然后只选择@offset =最低的一个减去另一个的最低值。然后只需使用偏移量即可加入。