SQL INSERT / SELECT不在insert表中

时间:2009-03-28 18:43:44

标签: sql insert

INSERT INTO     `tableA`
SELECT          `Col1`, 
                `Col2`,
                 NOW() 

FROM            `tableB`

WHERE           tableA.Col1 is not already in tableB.Col1

我无法正确获取WHERE子句以确保从tableA复制的记录只出现在表B中一次......

3 个答案:

答案 0 :(得分:5)

应为:

其中tableA.col1不在(从表B中选择col1)

答案 1 :(得分:3)

您真的需要SQL-2003 MERGE语句。我在下面的标准(怪诞,但这是你的SQL标准)中包含了BNF的MERGE语句(第14.9节,第883页)。翻译时,可能会转换为:

MERGE INTO TableA
    USING TableB ON TableA.Col1 = TableB.Col1
    WHEN NOT MATCHED INSERT (Col1, Col2, Col3)
                     VALUES(TableB.Col1, TableB.Col2, NOW());

我还没有运行那个知道MERGE语句的SQL DBMS - 这意味着它可能存在错误。注意,有一个WHEN MATCHED子句可以在标准中采用UPDATE; IBM DB2还支持DELETE子句,该子句不符合2003标准(不确定2008标准)。


14.9 <merge statement>(p837)

  

有条件地更新表的行,或将新行插入表中,或两者兼而有之。

<merge statement>    ::= 
         MERGE INTO <target table> [ [ AS ] <merge correlation name> ]
         USING <table reference> ON <search condition>
         <merge operation specification>

<merge correlation name>    ::=
         <correlation name>

<merge operation specification>    ::=
         <merge when clause> ...

<merge when clause>    ::=
         <merge when matched clause> |
         <merge when not matched clause>

<merge when matched clause>    ::=
         WHEN MATCHED THEN <merge update specification>

<merge when not matched clause>    ::= 
         WHEN NOT MATCHED THEN <merge insert specification>

<merge update specification>    ::=   UPDATE SET <set clause list>

<merge insert specification>    ::= 
         INSERT [ <left paren> <insert column list> <right paren> ]
         [ <override clause> ] VALUES <merge insert value list>

<merge insert value list>    ::= 
         <left paren> <merge insert value element>
         [ { <comma> <merge insert value element> }... ] <right paren>

<merge insert value element>    ::=
         <value expression> |
         <contextually typed value specification>

答案 2 :(得分:1)

您可以使用INSERT ... ON DUPLICATE KEY UPDATE语法。