Обновить Выберите объединить со значениями NULL - PullRequest
4 голосов
/ 27 июня 2011

У меня есть две таблицы STR_IndentDetail и PUR_POIndent

STR_IndentDetail:

   IndentID   ItemID    POQty     D1      D2       D3        RD
  ---------   -------  ------    ----     ---     ---        ---
    2            1       NULL     10       20      30        NULL
    2            6       NULL     20       40      60        45

PUR_POIndent:

   POID        IndentID      ItemID     Quantity     D1     D2       D3        RD
  ------      ----------     ------    ----------   ----    ---      ---       ---
    2            2             1           55         10     20      30        NULL
    2            2             6           100        20     40      60         45

Я хочу обновить таблицу STR_IndentDetail POQty с количеством PUR_POIndent.Я написал два заявления об обновлении на основе INNER JOIN и LEFT OUTER.Но оба запроса обновляют только одну строку, которая имеет значения в столбцах D1, D2, D3 и RD.Строка, содержащая столбец RD со значением NULL, не получает UPDATE.Как написать заявление об обновлении для этого случая.Ниже приведены мои два заявления об обновлении.

На основе внутреннего соединения:

     UPDATE STR_IndentDetail
                SET
                    POQty = PUR_POIndent.Quantity
                FROM
                    PUR_POIndent
                WHERE
                    PUR_POIndent.IndentID           = STR_IndentDetail.IndentID AND
                    PUR_POIndent.ItemID             = STR_IndentDetail.ItemID   AND
                    PUR_POIndent.D1                 = STR_IndentDetail.D1       AND
                    PUR_POIndent.D2                 = STR_IndentDetail.D2       AND
                    PUR_POIndent.D3                 = STR_IndentDetail.D3       AND
                    PUR_POIndent.RD = STR_IndentDetail.RD 
                    AND PUR_POIndent.POID = 2

На основе левого соединения:

 UPDATE STR_IndentDetail
                SET
                    POQty = PUR_POIndent.Quantity       
                FROM
                    STR_IndentDetail LEFT OUTER JOIN PUR_POIndent ON
                    PUR_POIndent.IndentID           = STR_IndentDetail.IndentID AND
                    PUR_POIndent.ItemID             = STR_IndentDetail.ItemID   AND
                    PUR_POIndent.D1                 = STR_IndentDetail.D1       AND
                    PUR_POIndent.D2                 = STR_IndentDetail.D2       AND
                    PUR_POIndent.D3                 = STR_IndentDetail.D3       AND
                    PUR_POIndent.RD = STR_IndentDetail.RD        WHERE 
                        PUR_POIndent.POID = 2

В обоих запросах игнорируется строка, значение RD которойнулевой.Я хочу обновить обе строки.Как это сделать?Любые предложения, пожалуйста.

Ответы [ 2 ]

5 голосов
/ 27 июня 2011

Нельзя сравнивать NULL значения с =. Измените условие на использование ISNULL и передайте значение, которого нет в вашей таблице.

пример

ISNULL(PUR_POIndent.RD, -999) = ISNULL(STR_IndentDetail.RD, -999)

Условия поиска сравнения NULL

При сравнении нулей необходимо соблюдать осторожность ценности. Поведение сравнения зависит от настройки набора Опция ANSI_NULLS.

Когда SET ANSI_NULLS включен, a сравнение, в котором один или несколько из Выражение NULL не дает либо ИСТИНА, либо ЛОЖЬ; это дает UNKNOWN. Это потому, что значение, которое неизвестно нельзя сравнить логически против любого другого значения. Это происходит, если любое выражение по сравнению с буквальным NULL, или если сравниваются два выражения и одно из них оценивается в NULL. За Пример, следующее сравнение всегда выдает UNKNOWN, когда ANSI_NULLS включено:

1 голос
/ 27 июня 2011

или

PUR_POIndent.RD=STR_IndentDetail.RD OR 
(PUR_POIndent.RD IS NULL AND STR_IndentDetail.RD IS NULL)
...