删除两个表之间的匹配主键值

时间:2014-07-01 16:58:32

标签: 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中主键值(列A /列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 个答案:

答案 0 :(得分:1)

听起来你想使用Dynamic SQL

动态SQL允许您通过构建查询来动态选择列和其他内容,而不是每次都执行存储过程。存在一些挑战,但在必要时它可以是一个有用的工具。你需要对它的SQL注入攻击更加小心。