【发布时间】:2014-07-01 16:58:32
【问题描述】:
问题:
如果行中的主键值与不同表中的行匹配,我正在尝试删除表中的行。例如,假设我有表 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)
但我不确定如何将其与我的其他陈述结合起来(或者如果可能的话)。我也对任何其他可能的解决方案持开放态度。谢谢!
【问题讨论】:
-
你听说过/尝试过dynamic sql吗?
-
@Pheonixblade9 我之前没有使用过动态sql,但我会看看它,看看我是否可以用它来解决这个问题。我在这里找到了关于动态 sql 的 oracle 文档:docs.oracle.com/cd/B28359_01/appdev.111/b28370/…。谢谢。
-
酷,我添加了它作为答案。