Oracle SQL UPDATE SELECT with JOIN 出错
Posted
技术标签:
【中文标题】Oracle SQL UPDATE SELECT with JOIN 出错【英文标题】:Oracle SQL UPDATE SELECT with JOIN got error 【发布时间】:2019-10-08 12:38:28 【问题描述】:这是我的 SQL 查询
UPDATE
(SELECT
*
FROM
web_fe_ipo_ipo_application apps
INNER JOIN web_fe_ipo_ipo_entry ipo ON apps.ipo_link_id = ipo.ipo_ref_number
WHERE
( ( apps.status = 0
OR ( apps.status = 2
AND apps.sub_status = 0
AND ipo.enable_omnibus_account = 1 ) )
AND ( apps.applied_qty BETWEEN 1 AND 10 )
AND apps.ipo_link_id = '984'
AND apps.latest = 1
AND ipo.latest = 1
AND apps.tranche_name = 'Public-1' )
ORDER BY
ipo_random(50)
FETCH FIRST 5 ROWS ONLY) selection
SET selection.initial_allot_qty = 5;
但是效果不好
我需要从表中选择随机数据,然后在执行此查询后更新我得到以下错误
Error at Command Line : 20 Column : 5
Error report -
SQL Error: ORA-01733: virtual column not allowed here
01733. 00000 - "virtual column not allowed here"
*Cause:
*Action:
【问题讨论】:
Oracle 在更新中使用联接不是很灵活。您可能需要考虑merge
。
我可以在使用merge
随机选择行后更新它吗?
。 .如果您的表有主键,那应该不是问题。
如果你知道,请写一个答案;对我有很大帮助
【参考方案1】:
使用 MERGE 语句。
这是一个例子:
MERGE INTO workers e
USING data_works h -- You can use the SELECT statement as well.
ON (e.f_id= h.f_id)
WHEN MATCHED THEN
UPDATE SET e.address= h.address
WHEN NOT MATCHED THEN
INSERT (f_id, address)
VALUES (h.f_id, h.address);
这是您的代码。希望它会奏效。
MERGE INTO web_fe_ipo_ipo_application apps
USING (SELECT * FROM web_fe_ipo_ipo_entry ipo ORDER BY
ipo_random)
ON(apps.ipo_link_id = ipo.ipo_ref_number)
WHEN MATCHED THEN
UPDATE SET apps.initial_allot_qty = 5
WHERE apps.status = 0
OR(apps.status = 2
AND apps.sub_status = 0
AND ipo.enable_omnibus_account = 1)
AND apps.applied_qty BETWEEN 1 AND 10
AND apps.ipo_link_id = '984'
AND apps.latest = 1
AND ipo.latest = 1
AND apps.tranche_name = 'Public-1'
AND rownum <=5;
使用 MERGE 语句从一个或多个源中选择行,用于表或视图中的 INSERT 或 UPDATE 操作。
您可以指定条件来确定是否更新目标表或视图。
合并操作是组合多个操作的便捷方式。它还允许您避免多个 INSERT、UPDATE 和 DELETE DML 语句。
【讨论】:
你能把答案和我的代码更相似吗,因为有ORDER BY
和INNER JOIN
命令行错误:4 列:2 错误报告 - SQL 错误:ORA-00907:缺少右括号
我对查询做了一些更改。你能再试一次吗?以上是关于Oracle SQL UPDATE SELECT with JOIN 出错的主要内容,如果未能解决你的问题,请参考以下文章
为啥我们在 Oracle SQL 中需要 SELECT FOR UPDATE?
在 SQL Server 中,如何以类似于 Oracle 的“SELECT FOR UPDATE WAIT”的方式锁定单行?