gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:34:31 24 4
gpt4 key购买 nike

问题:

如果行中的主键值与不同表中的行匹配,我将尝试删除表中的行。例如,假设我有表 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 .

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

关于sql - 删除两个表之间匹配的主键值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24515664/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com