Я делаю обновление временной таблицы в 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)
Надеюсь, что это поможет и спасибо.
Почему меняется, что в '(A.ColC = B.ColC)' не работает? –
Нет ничего плохого в том, что вы опубликовали; проблема, вероятно, в другом месте. Можете ли вы опубликовать небольшую, полную 'temp_table' и небольшую, полную инструкцию' UPDATE', которая демонстрирует проблему? – ruakh
@ypercube: Обратите внимание на 'WHERE NOT EXISTS'. Дело в том, что подзапрос * должен * находить записи в «Temp_Table B», соответствующие записям в «Temp_Table A», даже если это поле «NULL», но OP считает, что он не работает. – ruakh