Удалить совпадающие значения первичного ключа между двумя таблицами

#sql #oracle

#sql #Oracle

Вопрос:

Проблема:

Я пытаюсь удалить строки в таблице, если значения первичного ключа в строке совпадают со строкой в другой таблице. Например, скажем, у меня есть таблица TABLE1 и таблица TABLE2 с первичными ключами, обозначенными *:

 TABLE1 before:
Col A*| Col B*| Col C| Col D
__________________________
1      a         x      x 
2      a         x      x 
3      a         x      x 
3      b         x      x 

TABLE2:
Col A*| Col B*| Col C| Col D
__________________________
1      a         y      y 
4      a         y      y 
5      a         x      x
  

Я хочу удалить все строки, из TABLE1 которых совпадают значения первичного ключа (Col A / Col B) TABLE2 , затем скопировать все данные в TABLE2 в TABLE1 . В этом случае первая строка TABLE1 имеет совпадающие значения первичного ключа с TABLE2 , поэтому будет удалена только эта строка:

 TABLE1 after:
Col A*| Col B*| Col C| Col D
__________________________
2      a         x      x 
3      a         x      x 
3      b         x      x 
  

Код пока:

Следующий запрос, похоже, работает для выбора значений, подлежащих удалению:

 SELECT * FROM TABLE1 WHERE EXISTS (
SELECT * FROM TABLE2
WHERE TABLE1.A = TABLE2.A
AND TABLE1.B = TABLE2.B)
  

И для удаления строк, я полагаю, я мог бы изменить его на DELETE FROM вместо SELECT * FROM. Однако я хочу попытаться избежать жесткого кодирования столбцов первичного ключа, чтобы я мог использовать этот запрос в разных таблицах и просто изменять имена таблиц.

У меня есть следующий запрос, который выберет имена столбцов первичного ключа:

 SELECT COLUMN_NAME FROM (
SELECT cols.table_name, cols.column_name, cols.position, cons.status, cons.owner
FROM all_constraints cons, all_cons_columns cols
WHERE cols.table_name = 'TABLE1'
AND cons.constraint_type = 'P'
AND cons.constraint_name = cols.constraint_name
AND cons.owner = cols.owner
ORDER BY cols.table_name, cols.position)
  

Но я не уверен, как объединить это с моим другим утверждением (или если это возможно). Я также открыт для других идей по любым другим возможным решениям. Спасибо!

Комментарии:

1. Вы слышали / пробовали динамический sql ?

2. @Pheonixblade9 Я раньше не использовал динамический sql, но я взгляну на него и посмотрю, могу ли я как-то использовать его для решения этой проблемы. Я нашел документацию Oracle по динамическому sql здесь: docs.oracle.com/cd/B28359_01/appdev.111/b28370 /… . Спасибо.

3. Круто, я добавил это в качестве ответа.

Ответ №1:

Похоже, вы хотите использовать динамический SQL.

Динамический SQL позволяет выбирать столбцы и другие параметры «на лету» путем построения запроса, вместо того, чтобы использовать хранимую процедуру, которая выполняется каждый раз. Есть некоторые проблемы, но при необходимости это может быть полезным инструментом. Вам нужно быть несколько более осторожным в отношении атак SQL-инъекций с его помощью.

Комментарии:

1. В итоге я использовал динамический sql от MyBatis , так как я использовал Java. Но в любом случае я приму ваш ответ. Спасибо за помощь.