Sql 使用SELECT更新语句

Sql 使用SELECT更新语句,sql,oracle,Sql,Oracle,我试图用ORACLE中的SELECT语句编写UPDATE语句,但一直出现“invalid identifier”错误。我确信这个领域是存在的 这是我的SQL: update ( select distinct a.item_id, a.account_code, b.item_id, b.account_code from bp.poline a, mt.material b where a.item_id = b.item_id and a.account_code is not nu

我试图用ORACLE中的SELECT语句编写UPDATE语句,但一直出现“invalid identifier”错误。我确信这个领域是存在的

这是我的SQL:

update 
(
select distinct a.item_id, a.account_code, b.item_id, b.account_code
from bp.poline a, mt.material b 
where a.item_id = b.item_id  
and a.account_code is not null and b.account_code is null
)
set b.account_code = a.account_code
这就是我得到的错误:

Error report:
SQL Error: ORA-00904: "A"."ACCOUNT_CODE": invalid identifier
00904. 00000 -  "%s: invalid identifier

要将update语句与一起使用,请在SQL中选择语句,下面是语法…及其在我的代码中的作用 在这里,我使用的是派生表 这个vl能帮你吗

例如

更新SHIFT\u MST设置SHIFT\u MST.SHIFT\u DESC=A.SHIFT\u DESC,SHIFT\u MST.SHIFT\u CODE=A.SHIFT\u CODEfrom

从临时换档中选择*a


其中a.SHIFT_ID=SHIFT_MST.SHIFT_ID

SQL中使用update语句和select语句是语法…它在我的代码中起作用 在这里,我使用的是派生表 这个vl能帮你吗

例如

更新SHIFT\u MST设置SHIFT\u MST.SHIFT\u DESC=A.SHIFT\u DESC,SHIFT\u MST.SHIFT\u CODE=A.SHIFT\u CODEfrom

从临时换档中选择*a


其中a.SHIFT_ID=SHIFT_MST.SHIFT_ID

在Oracle中,只有当Oracle能够精确地为子查询的每一行定位基表的一行且仅一行时,才能更新子查询。此外,关于分析功能、聚合等的使用

在您的示例中,
DISTINCT
将使Oracle无法更新子查询,因为子查询的一行可以指向基表的几行

如果删除
不同的
,则仅当
物料(物料id)
上存在唯一索引时,查询才会起作用,以便表
POLINE
中的每一行最多只能与
物料
中的一行关联:

UPDATE (SELECT a.item_id, a.account_code acct_a, 
               b.item_id, b.account_code acct_b
          FROM bp.poline a, mt.material b
         WHERE a.item_id = b.item_id
           AND a.account_code IS NOT NULL
           AND b.account_code IS NULL)
   SET acct_a = acct_b

更新联接非常有效,但有几个限制,如果没有此索引怎么办

您可以使用不同的子查询编写标准更新:

UPDATE poline a
   SET a.account_code = (SELECT b.account_code
                           FROM material b
                          WHERE b.item_id = a.item_id
                            AND b.account_code is not null)
 WHERE a.account_code IS NULL
   AND a.item_id IN (SELECT b.item_id 
                       FROM material b
                      WHERE b.account_code IS NOT NULL)
然而,IMO最优雅的解决方案是由一个

MERGE INTO (SELECT * FROM a WHERE account_code IS NULL) a
     USING (SELECT * FROM b WHERE account_code IS NOT NULL) b
        ON (a.item_id = b.item_id)
WHEN MATCHED THEN UPDATE SET a.account_code = b.account_code;

在Oracle中,只有当Oracle能够为子查询的每一行精确定位基表的一行且仅一行时,才能更新子查询。此外,关于分析功能、聚合等的使用

在您的示例中,
DISTINCT
将使Oracle无法更新子查询,因为子查询的一行可以指向基表的几行

如果删除
不同的
,则仅当
物料(物料id)
上存在唯一索引时,查询才会起作用,以便表
POLINE
中的每一行最多只能与
物料
中的一行关联:

UPDATE (SELECT a.item_id, a.account_code acct_a, 
               b.item_id, b.account_code acct_b
          FROM bp.poline a, mt.material b
         WHERE a.item_id = b.item_id
           AND a.account_code IS NOT NULL
           AND b.account_code IS NULL)
   SET acct_a = acct_b

更新联接非常有效,但有几个限制,如果没有此索引怎么办

您可以使用不同的子查询编写标准更新:

UPDATE poline a
   SET a.account_code = (SELECT b.account_code
                           FROM material b
                          WHERE b.item_id = a.item_id
                            AND b.account_code is not null)
 WHERE a.account_code IS NULL
   AND a.item_id IN (SELECT b.item_id 
                       FROM material b
                      WHERE b.account_code IS NOT NULL)
然而,IMO最优雅的解决方案是由一个

MERGE INTO (SELECT * FROM a WHERE account_code IS NULL) a
     USING (SELECT * FROM b WHERE account_code IS NOT NULL) b
        ON (a.item_id = b.item_id)
WHEN MATCHED THEN UPDATE SET a.account_code = b.account_code;

这是否意味着
account\u code
不是您的别名
a
中的字段?account\u code存在于a中。我已经检查过了。请看这个相关问题:。这是否意味着
帐户\u代码
不是您的别名
a
中的字段?帐户\u代码存在于a中。我已经检查过了。请看这个相关问题:。谢谢。我曾试图删除不同的语法,但仍然得到相同的无效标识符错误。我无法在表上创建唯一索引。有什么办法可以写这个查询吗?@cooldude:这不是我唯一修改的东西,仔细看看:)你是说别名吗?我已经包括了别名并删除了区别。如果对你们有帮助的话,这里有一个。@VincentMalgrat,我看到了我的错误。我应该在SET命令中使用别名。我已经改变了这一点,不再出现无效标识符错误,但现在出现了另一个错误,即:“错误报告:SQL错误:ORA-01779:无法修改映射到非键保留表01779的列。”。00000-“无法修改映射到非键保留表的列”*原因:试图插入或更新映射到非键保留表的联接视图的列*操作:直接修改基础基表。我曾试图删除不同的语法,但仍然得到相同的无效标识符错误。我无法在表上创建唯一索引。有什么办法可以写这个查询吗?@cooldude:这不是我唯一修改的东西,仔细看看:)你是说别名吗?我已经包括了别名并删除了区别。如果对你们有帮助的话,这里有一个。@VincentMalgrat,我看到了我的错误。我应该在SET命令中使用别名。我已经改变了这一点,不再出现无效标识符错误,但现在出现了另一个错误,即:“错误报告:SQL错误:ORA-01779:无法修改映射到非键保留表01779的列。”。00000-“无法修改映射到非键保留表的列”*原因:试图插入或更新映射到非键保留表的联接视图的列*操作:直接修改基础基表。'检查此链接它将帮助您检查此链接它将帮助您