根据 ID 插入变量

Insert Variable based on an ID

我想使用 INSERT 查询插入多行(100 行),基于哪些 ID 不在 Table B 但在 Table A 中。我已经设法做到了,大多数需要插入的信息我都整理好了,除了一个。此值是在 Table A 中找到的值,每个 ID 都不同。

如何根据 ID 相同的地方从 A 到 B 插入正确的对应值? 简化 表格:

TableA                            TableB
ID    |Value                      ID    | Value   | Other | Other
--------------                   ---------------------------------
1     | ABC                       1     | ABC     | ****  | ****
2     | DFG                       2     | DFG     | ****  | ****
3     | HBO                       3     | HBO     | ****  | ****

我试过使用这个查询:

    INSERT INTO TableB
(
    ID,
    Value, 
    Other, 
    Other
)
SELECT 
    ID, 
    (SELECT TABLEA.Value FROM TABLEA,TABLEB WHERE TABLEA.ID = TABLEB.ID),
    ******, 
    ******

FROM TableA
WHERE ID IN 
(
    SELECT 
        TABLEA.ID
    FROM
        TABLEA

    MINUS

    SELECT 
        TABLEB.ID 
    FROM
        TABLEB
)

但显然问题在于它比较的是所有 ID,而不是我需要的唯一 ID。是否有任何解决方案可以在插入物内执行此操作?或者我是否需要先插入,将此值留空,然后使用更新查询为其提供正确的值?

编辑: 虽然提到的问题已经解决,但我还有其他一些相关的问题。 以下查询是当前正在进行的查询:

MERGE INTO  TableB
USING   TableA
ON      (TableB.id = TableA.id) 
WHEN MATCHED
    THEN
        UPDATE
            SET TableB.VALUE = TableA.VALUE
WHEN NOT MATCHED
    THEN
        INSERT 
        (
            id, 
            POSITION,  
            other,    
            other, 
            other,   
            other, 
            other,
            VALUE
        )
        VALUES 
        (
            TableA.id,
            (
                SELECT POSITION
                FROM TableC
                WHERE something = '<String Value>'
                AND VALUE = 
                (
                    SELECT VALUE 
                    FROM TableA 
                    WHERE TableA.id = <The Current 'ID'> 
                ) , 
            )
            *****,    
            *****, 
            *****,    
            *****, 
            *****, 
            TableA.VALUE
        );

主要问题是,我怎样才能从正确的行中得到 "Value",这样我才能得到正确的 "POSITION"。

我想你想要一个 MERGE 声明。

MERGE INTO TABLEB tgt
USING TABLEA src
    ON (tgt.ID = src.ID) 
WHEN MATCHED
    THEN
        UPDATE
        SET tgt.value = src.value
WHEN NOT MATCHED
    THEN
        INSERT (
            ID
            ,VALUE
            )
        VALUES (
            src.id
            ,src.value
            );

Demo

试试这个:-

    INSERT INTO B 
       SELECT A.id, A.value  
         FROM A 
         FULL OUTER JOIN B ON A.id = B.id WHERE B.id IS NULL 

如果我理解正确,您想在 TableB 中插入 TableA 中那些 ID 不在 TableB 中的行。对于 TableB 中存在的 ID,您希望使用 TableA 中的值更新它们的值。对吗?

如果是这样,您要使用 MERGE 语句。答案与前一位用户发布的答案相似,但已更正,这个应该可以正常工作:

MERGE INTO TABLEB tgt
USING TABLEA src
    ON (tgt.ID = src.ID) 
WHEN MATCHED
   THEN
       UPDATE
       SET tgt.value = src.value
WHEN NOT MATCHED
    THEN
        INSERT (
            ID
            ,VALUE
            )
        VALUES (
            src.id
           ,src.value
           );

附加问题的答案:

MERGE INTO  TableB
USING   TableA
ON      (TableB.id = TableA.id) 
WHEN MATCHED
    THEN
        UPDATE
            SET TableB.VALUE = TableA.VALUE
WHEN NOT MATCHED
    THEN
        INSERT 
        (
            id, 
            POSITION,  
            other,    
            other, 
            other,   
            other, 
            other,
            VALUE
        )
        VALUES 
        (
            TableA.id,
            (
                SELECT POSITION
                FROM TableC
                    WHERE something = '<String Value>'
                AND VALUE = TableA.VALUE
            ) as position,
            *****,    
            *****, 
            *****,    
            *****, 
            *****, 
            TableA.VALUE
        );

此外,如果您只想合并 ID 介于 1200 和 1299 之间的表(如我的回答的评论中所述),请尝试编写如下代码:

MERGE INTO  (SELECT * FROM TableB WHERE ID BETWEEN 1200 AND 1299) TableB 
USING   (SELECT * FROM TableA WHERE ID BETWEEN 1200 AND 1299) TableA 
ON      (TableB.id = TableA.id) 
WHEN MATCHED
    THEN
        UPDATE
            SET TableB.VALUE = TableA.VALUE
WHEN NOT MATCHED
    THEN
        INSERT 
        (
            id, 
            POSITION,  
            other,    
            other, 
            other,   
            other, 
            other,
            VALUE
        )
        VALUES 
        (
            TableA.id,
            (
                SELECT POSITION
                FROM TableC
                    WHERE something = '<String Value>'
                AND VALUE = TableA.VALUE
            ) as position,
            *****,    
            *****, 
            *****,    
            *****, 
            *****, 
            TableA.VALUE
        );