根据ID插入变量

时间:2018-07-27 06:41:50

标签: sql oracle insert-into

我想使用INSERT查询插入多个行(100个),基于哪些ID不是在表B中而是在表A中。我已经设法做到了,并且需要插入大多数信息除了一个,我已经整理好了。此值是在表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。在插件内部有解决方案吗?还是我需要先插入,将此值保留为空,然后使用UPDATE查询为它提供正确的值?

编辑: 尽管提到的问题已全部解决,但我还有其他一些相关问题。 以下查询是当前正在进行的工作:

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
        );

主要问题是,如何从正确的行中获取“值”,以便能够获取正确的“位置”。

3 个答案:

答案 0 :(得分:0)

我认为您想要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

答案 1 :(得分:0)

尝试一下:-

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

答案 2 :(得分:0)

如果我正确理解,您想在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
        );

此外,如果您只想为1200和1299之间的ID合并表(如我的答案的注释中所述),请尝试编写如下代码:

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
        );