объединить SQL-условие является нулевой проблемой - PullRequest
0 голосов
/ 15 апреля 2019

У меня есть два очень похожих оператора SQL.На них работают, а на нет.Сообщение об ошибке SQL, кажется, вводит в заблуждение.Можете ли вы понять это?

SQL 1 - это прекрасно работает

    Merge into   t1 
    Using ( 
        Select art_ref_nr, channel, some_value From s1 ) t2
    On ( t1.art_ref_nr = t2.art_ref_nr and t1.channel = t2.channel
        and ( t1.datasource is null
            or (t1.datasource = 'no such value' ) -- only null values will be found
        ))
    WHEN MATCHED THEN UPDATE SET
        t1.some_value = t2.some_value
    ,   t1.datasource = 'value 1'
    ;

SQL 2 - это не удается

    Merge into   t1 
    Using ( 
        Select art_ref_nr, channel, some_value From s1 ) t2
    On ( t1.art_ref_nr = t2.art_ref_nr and t1.channel = t2.channel
        and ( t1.datasource is null
       ))
    WHEN MATCHED THEN UPDATE SET
        t1.some_value = t2.some_value
    ,   t1.datasource = 'value 2'
    ;

SQL1 работает нормально.Сообщения SQL2:

Невозможно обновить столбцы, указанные в предложении ON: строка Причина: LHS в UPDATE SET содержит столбцы, указанные в предложении ON

С другой стороныЯ ссылаюсь на условие «источник данных» в обоих SQL, поэтому сообщение об ошибке не может быть полной правдой.

Кажется, проблема в том, что один раз я проверяю только записи с нулевыми значениями.Но почему это влияет на логику SQL?

Много приветствий, Питер

1 Ответ

1 голос
/ 15 апреля 2019

Я предполагаю, что ваш первый запрос не выдаст ошибку, потому что соответствующая строка не найдена.

Для второго запроса он должен выполнить ОБНОВЛЕНИЕ, но не может, потому что вы обновляетестолбец ОБНОВИТЬ в предложении ON.

Чтобы преодолеть это, попробуйте перейти к предложению WHERE, части предложения ON, ссылающейся на столбцы, которые вы пытаетесь ОБНОВИТЬ:

Merge into   t1 
Using ( 
    Select art_ref_nr, channel, some_value From s1 ) t2
On (t1.art_ref_nr = t2.art_ref_nr and t1.channel = t2.channel)
WHEN MATCHED THEN UPDATE SET
    t1.some_value = t2.some_value
,   t1.datasource = 'value 2'
WHERE t1.datasource is null
;
...