如果一行中的主键值与另一个表中的行匹配,我试图删除表中的行。例如,假设我有表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)
但我不确定如何将此与我的其他陈述相结合(或者如果这是可能的话)。我也对任何其他可能的解决方案持开放态度。谢谢!
答案 0 :(得分:1)
听起来你想使用Dynamic SQL。
动态SQL允许您通过构建查询来动态选择列和其他内容,而不是每次都执行存储过程。存在一些挑战,但在必要时它可以是一个有用的工具。你需要对它的SQL注入攻击更加小心。