Oracle MERGE处理表是否自动联接?

时间:2018-08-17 11:58:11

标签: sql oracle

我是ORACLE MERGE Command的新手。

我打算根据源表数据在目标表中插入一行。 源表具有与目标表的外键关系。源表中的Column1和Column2必须存在,以允许目标表中具有这些值的行。

我的合并查询如下。

MERGE into TARGET_TABLE target 
USING (
      Select column1, column2 from SOURCE_TABLE where column3='somevalue'
) source
ON (
    source.column1 is null or target.column4='anotherValue'
)
WHEN NOT MATCHED THEN INSERT (
    target.column1,
    target.column2,
    target.column3,
    target.column4
) VALUES (
    source.column1,
    source.column2,
    'somevalue3',
    'anotherValue'
)  

仅当发现有source.column1存在于'somevalue'的source.column3值(即不为null和

)时,才插入一行。

目标表中没有行,其第一列,第二列和第四列分别具有以下值

  1. 当column3为'someValue'时,源表中column1的值相同
  2. 当column3为'someValue'时,源表中column2的值相同
  3. 'anotherValue'

即使我在“ ON”子句中的MATCH条件不包括它们,我也需要解释为什么它与上面的Point1和Point2匹配。

我对此进行编码时,由于目标表中的许多列中column4的值都不为anotherValue,因此我希望多行不能匹配该条件。

尝试建立1号

表1(源)

COL1 COL2 COL3

a1 a2 a3

表2(目标)

COL1 COL2 COL3 COL4

无行

期望的行为:

在表2中插入一行

  1. 如果源表中有一行,其中COL3 ='a3'和

  2. 如果目标中没有行,且col1 = a1且col2 = a2且col4 = b4

  3. 要插入到目标表中的数据是:col1 = a1,col2 = a2和col4 = b4

观察到的行为

符合期望的行为,令我感到惊讶。我想知道我需要像这样的在线条款

ON (
    source.column1 is null or source.column1 != target.column1 or source.column2 != target.column2 or target.column4 = 'anotherValue'
)

基于DEMorgan的定律:

NOT(A和B)= NOT A或NOT B;

NOT(A或B)= NOT A和NOT B

0 个答案:

没有答案