Как я могу сравнить столбец в Self Join с самим собой, если он не нулевой? - PullRequest
1 голос
/ 07 марта 2012

Я делаю обновление для временной таблицы в Oracle.Я думал, что я мог бы использовать NVL, чтобы установить значение (по существу, делая нулевое значение с обеих сторон равным)

Что происходит в обновлении, так это то, что если число сравнений остается в силе, то столбец не обновляется,один из этих сравниваемых столбцов может быть нулевым, а Oracle не сравнивает нулевые значения.

Код может облегчить понимание.

UPDATE Temp_Table A Set T.ColZ = 'something'
WHERE NOT EXISTS
( SELECT * FROM Temp_Table B
WHERE A.ColF = B.ColF
AND ...more column comparisons
AND ((NVL(A.ColC, 'N/A') = NVL(B.ColC, 'N/A'))
     AND more column Comparisons)
);

Обновление работает, когда ColC не содержит пустых значений, но когдаУ меня есть строка, что ColC равен Null, тогда он обновляется, несмотря на то, что он одинаков для обеих сторон.

Я также пытался использовать подзапрос в предложении where, но безуспешно.Будет ли подзапрос лучшим методом для использования здесь?

Любая помощь или советы приветствуются.

Просто хочу добавить, что в идеале я бы хотел вообще пропустить сравнение, если этот столбец равен нулюпоэтому любые идеи о том, как это сделать, приветствуются.Спасибо

A за каждый запрос Ypers пример с несколькими строками ... надеюсь, это достаточно ясно

Temp_Table
Col1 | Col2 | Col3 | Col4 |Col5 |Col6
AB   |  DC  |  EF  |  GH  | 08  |
BA   |  CD  |  EF  |  GH  | 08  |
AB   |  DC  |  HI  |  NULL| 05  |
AB   |  DC  |  JK  |  LM  | 04  |

В приведенной выше строке 1 строка соответствует строке 2. Мое обновление должновыделите строки, такие как 3 и 4, где нет соответствующей строки.Я могу заставить это работать, когда Col4 не является Нулевым, но это терпит неудачу, когда это значение НульПросто FYi в temp_table для любого Col2, имеющего значение DC Col1, будет иметь значение AB в качестве значения, а для любого значения CD в Col2 тогда Col1 будет иметь значение BA.

UPDATE Temp_Table T SET Col6 = 'Unmatched'
WHERE NOT EXISTS
( SELECT * FROM Temp_Table B
 WHERE T.Col3 = B.Col3
 AND   T.COl4 = B.Col4
 AND   T.COl5 = B.Col5 )

Надеюсь, что это помогает и спасибо.

1 Ответ

2 голосов
/ 07 марта 2012

Если я правильно понимаю, вы хотите изменить:

((NVL(A.ColC, 'N/A') = NVL(B.ColC, 'N/A'))

до:

(A.ColC = B.ColC OR A.ColC IS NULL OR B.ColC IS NULL)

После обновления вопроса.

Вы можете попробовать это:

UPDATE Temp_Table T 
SET Col6 = 'Unmatched'
WHERE NOT EXISTS
( SELECT * 
  FROM Temp_Table B
  WHERE T.Col3 = B.Col3
    AND T.COl4 = B.Col4
    AND T.COl5 = B.Col5

    AND NOT (  T.Col1 = B.Col1    --- all the other columns except Col6
           AND T.Col2 = B.Col2
            )
)
...