在交叉联接子查询中创建 rowID / 标识列

问题描述 投票:0回答:1

我有一个表,其中包含两个 id 的一些组合。我需要为每个其他组合创建一个唯一的 id。由于某些组合已经存在,我不能只使用标识符列。

以下代码有效:

CREATE TABLE #A (A_ID INT)
CREATE TABLE #B (B_ID INT)
CREATE TABLE #C (C_ID INT, A_ID INT, B_ID INT)
CREATE TABLE #D (C_ID INT, A_ID INT, B_ID INT)

INSERT INTO #A VALUES (1),(2)
INSERT INTO #B VALUES (1),(2)
INSERT INTO #C VALUES (1,1,1),(2,1,2)


SELECT IDENTITY(INT,1,1) AS N, a.A_ID, b.B_ID
INTO #temp
FROM #A a 
CROSS JOIN #B b

INSERT INTO #D (C_ID, A_ID, B_ID)
    SELECT ISNULL(c.C_ID, -1 * temp.N), temp.A_ID, temp.B_ID
    FROM #temp temp
    LEFT OUTER JOIN #C c ON c.A_ID = temp.A_ID 
                         AND c.B_ID = temp.B_ID

SELECT * FROM #D

结果:

C_ID A_ID B_ID
--------------
1     1   1
-2    2   1
2     1   2
-4    2   2

但是,这有点难看,我觉得我应该能够将其作为子查询来执行,例如:

INSERT INTO #D (C_ID, A_ID, B_ID)
    SELECT ISNULL(c.C_ID, -1 * temp.N), temp.A_ID, temp.B_ID
    FROM
        (SELECT 
             IDENTITY(INT, 1, 1) AS N, 
             a.A_ID, b.B_ID
         FROM 
             #A a 
         CROSS JOIN 
             #B b) temp
    LEFT OUTER JOIN 
        #C c ON c.A_ID = temp.A_ID AND c.B_ID = temp.B_ID

但是现在我收到错误:

消息 156,第 15 级,状态 1,第 19 行
关键字“IDENTITY”附近的语法不正确

有没有一种干净的方法可以在 SQL 中执行此操作?

sql sql-server subquery cross-join
1个回答
0
投票

这个模式怎么样,我用它来在维度表中分配新 ID,而不使用 IDENTITY 或序列。

INSERT INTO #A VALUES (1),(2)
INSERT INTO #B VALUES (1),(2)
INSERT INTO #C VALUES (1,1,1),(2,1,2)


select coalesce(c.C_ID, max(c.C_ID) over() + row_number() over (partition by c.C_ID order by a.A_ID, b.B_ID)) C_ID,
       a.A_ID,
       b.B_ID       
from #A a 
cross join #B b
left join #c c
  on c.A_ID = a.A_ID
  and c.B_ID = b.B_ID
order by C_ID

输出

C_ID                 A_ID        B_ID
-------------------- ----------- -----------
1                    1           1
2                    1           2
3                    2           1
4                    2           2
© www.soinside.com 2019 - 2024. All rights reserved.