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 BYINNER JOIN 命令行错误:4 列:2 错误报告 - SQL 错误:ORA-00907:缺少右括号 我对查询做了一些更改。你能再试一次吗?

以上是关于Oracle SQL UPDATE SELECT with JOIN 出错的主要内容,如果未能解决你的问题,请参考以下文章

为啥我们在 Oracle SQL 中需要 SELECT FOR UPDATE?

SQL 语句Oracle :select嵌套:

在 SQL Server 中,如何以类似于 Oracle 的“SELECT FOR UPDATE WAIT”的方式锁定单行?

oracle行锁select for update

for update造成的Oracle锁表与解锁

oracle几百万条数据怎么update