2012-03-06 1 views
1

Я делаю обновление временной таблицы в Oracle. Мое мышление состояло в том, что я мог использовать NVL для установки значения (по существу, равное нулю значение с обеих сторон)Как я могу сравнить столбцы в Self Присоединиться к самому себе, если это не Null?

Что происходит в обновлении, так это то, что если ряд сравнений имеет значение true, то столбец не обновляется, один из эти сравниваемые столбцы могут быть нулевыми, а 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 не содержит NULLS, но когда у меня есть строка, что ColC является Null, то он обновляется, несмотря на то же самое с обеих сторон.

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

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

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

А на 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 не является Null, но он терпит неудачу, когда это значение равно Null. Просто 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) 

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

+0

Почему меняется, что в '(A.ColC = B.ColC)' не работает? –

+0

Нет ничего плохого в том, что вы опубликовали; проблема, вероятно, в другом месте. Можете ли вы опубликовать небольшую, полную 'temp_table' и небольшую, полную инструкцию' UPDATE', которая демонстрирует проблему? – ruakh

+0

@ypercube: Обратите внимание на 'WHERE NOT EXISTS'. Дело в том, что подзапрос * должен * находить записи в «Temp_Table B», соответствующие записям в «Temp_Table A», даже если это поле «NULL», но OP считает, что он не работает. – ruakh

ответ

2

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

((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 
      ) 
) 
+0

Спасибо за ответ, к сожалению, я не могу сделать эту работу так, как ей нужно. Руах верен, когда я говорю, что там, где эти совпадения не существуют, происходит обновление. Не уверен, что это помогает понять ситуацию или нет. Я буду продолжать работать над этим. Благодарю. – dee

+0

@dee: Если вы можете найти проблему на примере с несколькими строками, это поможет нам понять, в чем проблема. –

+0

Я сделал небольшой пример temp_table в своем посте ... не уверен, что это помогает уточнить. Спасибо – dee

 Смежные вопросы

  • Нет связанных вопросов^_^