使用具有和 MIN 函数非键保留表错误进行更新
Posted
技术标签:
【中文标题】使用具有和 MIN 函数非键保留表错误进行更新【英文标题】:Update using having and MIN function non key-preserved table error 【发布时间】:2020-02-12 04:44:00 【问题描述】:我在两个不同的表中有以下数据。我可以使用选择查询检索所需的记录,但是我无法更新这些记录的ROW_IND
。我使用的更新语句给了我错误。任何指针将不胜感激。
表 CLP:
ID KEY EFF_DT ROW_IND
28420000000006 4599 1/1/2000 1
28420000000006 21164 10/16/2019 1
28420000000011 58429 1/1/2000 1
28420000000011 68434 10/16/2019 1
表格 CPI:
KEY2 ID2
21164 28420000000006
68434 28420000000011
查询:
SELECT p.id , p.key, i.key AS KEY2, i.id AS ID2, p.EFF_DT, p.row_ind
FROM CLP P, CLI I
WHERE p.id = i.id
AND P.KEY <> I.KEY
AND p.row_ind = 1
AND P.id IN
(
SELECT id
FROM CLP
WHERE row_ind = 1
GROUP BY id
HAVING count(*) > 1
);
ID KEY KEY2 ID2 EFF_DT ROW_IND
28420000000006 4599 21164 28420000000006 1/1/2000 1
28420000000011 58429 68434 28420000000011 1/1/2000 1
更新查询:
UPDATE
(
< The Above SELECT Query >
) A
SET A.row_ind = 0
错误: ORA-01779:无法修改映射到非键保留表的列
【问题讨论】:
【参考方案1】:UPDATE
语句的这种语法不能在 Oracle 中使用,但可以在 mysql 中使用。或者,您可以尝试使用MERGE
语句:
MERGE INTO CLP t
USING
(
SELECT p.id , p.key, i.key AS KEY2, i.id AS ID2, p.EFF_DT, p.row_ind
FROM CLP p
JOIN CPI i
ON p.id = i.id
WHERE p.key <> i.key
AND p.row_ind = 1
AND P.id in
(
SELECT id
FROM CLP
WHERE row_ind = p.row_ind
GROUP BY id
HAVING count(*) > 1
)
) tt
ON (tt.key2 = t.key)
WHEN MATCHED THEN UPDATE SET t.row_ind = 0;
在哪里
您最好将旧式SELECT
语句转换为
包含显式 JOIN
关键字而不是逗号分隔的语法
JOIN
s
不需要重复条件row_ind = 1
两次,替换
第二个row_ind = p.row_ind
更可取
Demo
【讨论】:
以上是关于使用具有和 MIN 函数非键保留表错误进行更新的主要内容,如果未能解决你的问题,请参考以下文章