Sql 使用SELECT更新语句
我试图用ORACLE中的SELECT语句编写UPDATE语句,但一直出现“invalid identifier”错误。我确信这个领域是存在的 这是我的SQL: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
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-“无法修改映射到非键保留表的列”*原因:试图插入或更新映射到非键保留表的联接视图的列*操作:直接修改基础基表。'检查此链接它将帮助您检查此链接它将帮助您