sql - 使用具有和 MIN 函数非键保留表错误进行更新
问题描述
我在两个不同的表中有以下数据。我可以使用选择查询检索所需的记录,但是我无法更新ROW_IND
这些记录。我使用的更新语句给了我错误。任何指针将不胜感激。
表中电:
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:无法修改映射到非键保留表的列
解决方案
语句的这种语法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
的语法 - 无需重复条件
row_ind = 1
两次,将第二个替换row_ind = p.row_ind
为更可取
推荐阅读
- android - 如何在android中以横向模式设置布局?
- reactjs - 如何解决:无法在未安装的组件上找到节点
- android - Android - 带有 Dagger2 的 Kotlin,lateinit 属性组件尚未初始化
- amazon-web-services - AWS uploads only git files, but needed the entire folder
- angular - 打字稿错误类'主题
' 错误地扩展了基类 'Observable '。属性“电梯”的类型不兼容 - php - 认知服务 - 创建 FaceList 和 PersonGroup 时出错 AZURE
- c++ - C ++如何将同一类的实例作为属性?
- ruby - Ruby 类设计 - 我应该在单独的文件中创建常量吗?
- c# - 获取两个列表中的唯一元素,其中项目不匹配 100%(只是部分)
- ios - Swift 委托没有被调用