SQL INSERT / SELECT, где нет в таблице вставки - PullRequest
3 голосов
/ 28 марта 2009
INSERT INTO     `tableA`
SELECT          `Col1`, 
                `Col2`,
                 NOW() 

FROM            `tableB`

WHERE           tableA.Col1 is not already in tableB.Col1

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

Ответы [ 3 ]

5 голосов
/ 28 марта 2009

следует читать:

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

3 голосов
/ 28 марта 2009

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

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

Я не запускал эту СУБД SQL, которая знает об операторе MERGE - это означает, что в нем, вероятно, есть ошибки. Обратите внимание, что в стандарте есть предложение 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>
1 голос
/ 28 марта 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...