gpt4 book ai didi

oracle - 使用 Oracle 数据库的 JOIN 语法更新

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

首先,我执行以下 SQL 语句。

drop table names;
drop table ages;

create table names (id number, name varchar2(20));
insert into names values (1, 'Harry');
insert into names values (2, 'Sally');
insert into names values (3, 'Barry');

create table ages (id number, age number);
insert into ages values (1, 25);
insert into ages values (2, 30);
insert into ages values (3, 35);

select * from names;
select * from ages;

因此,创建了以下表格。

        ID NAME
---------- ----------
1 Harry
2 Sally
3 Barry

ID AGE
---------- ----------
1 25
2 30
3 35

现在,我想更新 Sally 的年龄增加 1,即将其设置为 31。以下查询工作正常。

update ages set age = age + 1 where id = (select id from names where name = 'Sally');
select * from ages;

表格现在看起来像这样。

        ID        AGE
---------- ----------
1 25
2 31
3 35

我想知道是否有一种方法可以通过连接来完成。例如,我尝试了以下查询,但都失败了。

SQL> update ages set age = age + 1 from ages, names where ages.id = names.id and names.name = 'Sally';
update ages set age = age + 1 from ages, names where ages.id = names.id and names.name = 'Sally'
*
ERROR at line 1:
ORA-00933: SQL command not properly ended


SQL> update ages set age = age + 1 from names join ages on ages.id = names.id where names.name = 'Sally';
update ages set age = age + 1 from names join ages on ages.id = names.id where names.name = 'Sally'
*
ERROR at line 1:
ORA-00933: SQL command not properly ended

最佳答案

更新语句的语法是:

http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_10007.htm

enter image description here

dml_table_expression_clause 是:

enter image description here

请注意上述语法的( subquery )部分。

子查询 是一种允许执行连接更新的功能。

最简单的形式可以是:

UPDATE (
subquery-with-a-join
)
SET cola=colb

在更新连接之前,您必须了解此处列出的限制:

https://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_8004.htm

The view must not contain any of the following constructs:

  • 集合算子
  • DISTINCT 运算符
  • 聚合或分析函数
  • GROUP BY、ORDER BY、MODEL、CONNECT BY 或 START WITH 子句
  • SELECT 列表中的集合表达式
  • SELECT 列表中的子查询
  • 指定为 WITH READ ONLY 的子查询
  • 加入,除了一些异常(exception),如 Oracle 数据库管理员指南中所述

以及与可更新 View 相关的通用规则 - 此处(部分:更新加入 View ):
http://docs.oracle.com/cd/B19306_01/server.102/b14231/views.htm#sthref3055

All updatable columns of a join view must map to columns of a key-preserved table. See "Key-Preserved Tables" for a discussion of key-preserved tables. If the view is defined with the WITH CHECK OPTION clause, then all join columns and all columns of repeated tables are not updatable.

我们可以先创建一个带连接的子查询:

SELECT age 
FROM ages a
JOIN names m ON a.id = m.id
WHERE m.name = 'Sally'

此查询仅返回以下结果:

       AGE
----------
30

现在我们可以尝试更新我们的查询:

UPDATE (
SELECT age
FROM ages a
JOIN names m ON a.id = m.id
WHERE m.name = 'Sally'
)
SET age = age + 1;

但是我们得到一个错误:

SQL Error: ORA-01779:cannot modify a column which maps to a non key-preserved table

此错误表示不满足上述限制之一(保留键的表)。

但是,如果我们向表中添加主键:

alter table names add primary key( id );
alter table ages add primary key( id );

那么现在更新工作没有任何错误,最终结果是:

select * from ages;

ID AGE
---------- ----------
1 25
2 31
3 35

关于oracle - 使用 Oracle 数据库的 JOIN 语法更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37001180/

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