СЗЛ INSERT/SELECT, где не в таблице вставки

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

FROM            `tableB`

WHERE           tableA.Col1 is not already in tableB.Col1

Я не могу получить право пункта ГДЕ, чтобы убедиться, что запись, скопированная из таблицыA, появляется в таблице B только один раз...

Ответ на: "СЗЛ INSERT/SELECT, где не в таблице вставки"

Количество ответов:3

следует прочитать:

, где tableA.col1 не в (выбрать col1 из таблицы B)

Вы можете использовать синтаксис INSERT ... ON DUPLICATE KEY UPDATE syntax..

Вы действительно хотите заявление СЗЛ-2003 MERGE. Я включил BNF для заявления MERGE (раздел 14.9, p837) от стандарта (гротеск, но это стандарт S'L для вас) ниже. При переводе это может перевести на:

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

Я не запускал, что мимо S'L DBMS, который знает о заявлении MERGE - это означает, что, вероятно, есть ошибки в нем. Обратите внимание, что есть пункт WHEN MATCHED, который может принять ОБНОВЛЕНИЕ в стандарте; IBM DB2 также поддерживает оговорку DELETE, которая не входит в стандарт 2003 года (не уверен в стандарте 2008 года).


14.9 <merge statement> (p837) (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>