2016-08-03 5 views
1

У меня есть две таблицы.Обновить первичный ключ столбца таблицы на основе таблицы сопоставления

  1. таблица содержит записи со столбцом A (номер типа, первичный ключ).
  2. таблица содержит записи со столбцами A, B (номер типа). Второй представляет таблицу сопоставления.

В чем проблема?

мне нужно сделать переназначение всех записей в таблице 1, в частности, колонок А на колонку B на основе таблицы отображения 2. Но проблема состоит в том, что таблица 1 содержат записи, которые имеют также значения B из таблицы 2 (в колонке А). Это означает, что когда я сделаю переназначение таблицы 1, тогда может возникнуть проблема с уникальностью, потому что столбец А в таблице 1 является первичным ключом.

Я попытался выбрать счетчик всех записей, которые нужно переустановить, но я точно не знаю, если мой запрос верен.

Вот эти две таблицы:

select * from temp_1; 
select * from temp_2; 

Здесь вы выберите с кол:

SELECT count(*) FROM temp_1 T1 
WHERE EXISTS (SELECT 1 FROM temp_2 T2 WHERE T2.a = T1.a 
and not exists (select 1 from temp_1 T1b where T2.b = T1b.a)); 

Образец данных:

Таблица 1:
1 , 2, 3, 4, 5, 40, 50

Таблица 2:
1-11, 2-22, 3-33, 4-40 , 5-50

Результат Таблица 1 после переназначения:
11, 22, 33, 4, 5, 40, 50 Остающаяся проблема значения

Эти дерзкие отмечены значения являются проблемными, если вы меня понимаете.

+0

Можете ли вы обновить свой вопрос, сообщив нам, какую версию SQL (например, MySQL, SQL Server и т. Д.) Вы используете вместе с образцами данных? –

+0

@TimBiegeleisen Название читает ** ORACLE **. – FDavidov

+0

@FDavidov Извините ...Я не видел никаких тегов –

ответ

0

Итак, у вас есть таблица 1 со столбцом A, которая содержит значения, которые могут также отображаться как новые значения из повторного сопоставления. Единственное решение - использовать временную таблицу, в которую вы развертываете новое сопоставление, и, как только вы закончите, скопируйте новое сопоставление в таблицу 1.

+0

Возможно, это решение, возможно, это даже лучшее решение, но это, конечно, не только ** решение **. Например, можно отказаться от ограничения PK. Или, если ограничение было определено с помощью DEFERRABLE, оно может быть отложено (и повторно введено после выполнения всей работы). – mathguy

+0

Проблема не в уникальности ключа. Проблема заключается в следующем: у вас есть запись с полем «A» = 10 и другая запись с полем «A» = 20. Когда вы получите новое значение для первой записи, вы получите 20. Теперь, когда вы получаете значение для вторая запись - 40. Теперь вы хотите обновить записи, значение «A» которых составляет от 20 до 40. Вы будете ** ошибочно ** обновлять обе записи. – FDavidov

+0

И да, вы правы, могут быть другие решения, но мои мужества говорят мне не тратить усилий на их поиск. – FDavidov

0

Это не ответ - публикация как одна, чтобы запрос мог отформатировать.

Возможно, вы захотите проверить, не является ли ограничение PK отсроченным. Например, вы можете запустить запрос ниже. «......» означает ваше имя таблицы в одинарных кавычках (и во ВСЕХ CAPS). Если таблицы не являются вашими, запросите ALL_CONSTRAINTS вместо USER_CONSTRAINTS. Если вам повезет, ограничение откладывается. Если нет, мы можем думать о других решениях. Удачи!

select constraint_name, deferrable, deferred 
from user_constraints 
where constraint_type = 'P' 
    and table_name = '.....' 
Смежные вопросы