1
INSERT INTO Table1(group, account)

OUTPUT inserted.Id, B.title, B.amount 
INTO Table2(id2, title, amount) 

SELECT A.*,
         B.title,
           B.amount,
            B.id2    
FROM Table1 AS A

LEFT OUTER JOIN
(SELECT  title,
          amount,
           id2
 FROM Table2) AS B
 ON A.id = B.id2

我坚持这个..我有two join tables,我想要的是复制同一组数据到它自己,并通过使用子句table1将新复制的数据的新 id 从列复制table1table2列。id2OUTPUT

但是现在通过上面的查询,我无法通过我需要的列..如何插入列B.title&B.amounttable2

4

1 回答 1

1

如果表 1 和表 2 具有 1:1 的关系,并且两者之间不存在外键,那么您可以在单个语句中执行此操作:

MERGE Table1 AS a 
USING
(   SELECT  A.[group], A.account, B.title, B.amount, B.id2    
    FROM    Table1 AS A
            LEFT OUTER JOIN Table2 AS B
                ON A.id = B.id2
) AS b
    ON 1 = 0
WHEN NOT MATCHED THEN 
    INSERT ([group], account)
    VALUES (b.[group], b.account)
OUTPUT inserted.Id, B.title, B.amount 
    INTO Table2(id2, title, amount);

SQL Fiddle 示例

但实际上,如果您的表是相关的,它们应该有一个外键,并且在大多数情况下它们不会是 1:1,而是 1:n。

在这种情况下,您仍然需要使用MERGE来捕获新 ID 和旧 ID,但是您需要在对 Table2 执行第二次插入之前在临时表中捕获此映射:

DECLARE @Map TABLE (OldID INT NOT NULL, NewID INT NOT NULL);

MERGE Table1 AS a 
USING
(   SELECT  A.ID, A.[group], A.account  
    FROM    Table1 AS A
) AS b
    ON 1 = 0
WHEN NOT MATCHED THEN 
    INSERT ([group], account)
    VALUES (b.[group], b.account)
OUTPUT inserted.Id, b.ID
    INTO @Map(NewID, OldID);

INSERT Table2 (id2, title, amount)
SELECT  m.NewID, b.title, b.amount
FROM    @Map AS m
        INNER JOIN Table2 AS b
            ON b.ID2 = m.OldID;

SQL Fiddle 示例

于 2018-07-19T10:25:48.650 回答