【问题标题】:making an update query through a subquery using ROW_NUMBER()?使用 ROW_NUMBER() 通过子查询进行更新查询?
【发布时间】:2015-09-09 18:02:32
【问题描述】:

此查询不起作用错误:01427. 00000 - “单行子查询返回多行”:

UPDATE table_name SET column_update =( 
  SELECT ROW_NUMBER() 
  OVER(order by column_day_job) from table_name
) WHERE column_pearson_id = 808;

此 SELECT 完美运行。我想以相同的顺序复制 sequence_day_job 列的 ROW_NUMBER () 值

SELECT  column_person_id, column_day_job, sequence_day_job,
ROW_NUMBER()
  OVER (PARTITION BY column_person_id
      ORDER BY column_day_job)
  FROM table_name;

UPDATE 10/09/2015 (01) - UPDATE 试图完成这样的事情,但它不起作用,如果临时表可以解决我的问题?这对于临时表的使用来说似乎是比较简单的事情,而 cmo 会反复认为使用临时表并不是那么有趣。

 UPDATE table_name SET sequence_day_job = (
 SELECT ROW_NUMBER() OVER (PARTITION BY column_person_id ORDER BY column_day_job)  
       FROM PC_COMENTARIO )xx

)WHERE column_person_id = 808; //ERROR: 01427. 00000 - “单行子查询返回多于一行”

【问题讨论】:

  • 虽然知道什么不起作用很有趣,但如果您需要帮助使其起作用,您能说明它应该做什么吗?
  • 'column_day_job' '不是表的物理列。这是ROW_NUMBER()的结果

标签: sql oracle subquery


【解决方案1】:

这应该可行:

MERGE INTO table_name t
USING ( SELECT rowid rid, row_number() OVER (order by sequence_job_day) rn FROM table_name ) u
ON ( t.rowid = u.rid AND t.column_pearson_id = 888 )
WHEN MATCHED THEN UPDATE SET t.column_update = u.rn;

注意——column_update 在表中的所有行中都是唯一的。如果您只想在每个人中获得唯一的排序,您需要PARTITION BY column_pearson_id。此外,您可以将=888 条件放在USING 子句中,并将其从MATCH 子句中取出。

【讨论】:

  • 我在案例中使用了 select 分区,但是在你的示例中我会使用 PARTITION BY 吗?我放哪儿了?
  • row_number() OVER (PARTITION BY t.column_peason_id ORDER BY sequence_job_day) rn
  • 我不得不删除此人的标识符别名,因为他出错了,然后工作,谢谢
【解决方案2】:

为什么需要子查询。这行不通:

UPDATE table_name
SET column_update = column_day_job

更新 - 我认为你需要这样的东西。语法可能不正确,但我认为您需要创建一个包含所需行号的虚拟表,然后选择正确的行。如果该表中的日期是唯一的,那么您可以使用这些日期。

UPDATE table_name t1 SET column_update =( 
  SELECT t1.rownum
  from (select ROW_NUMBER() from table_name t2) t3
  where t3.seq_day_job = t1.seq_day_job
) WHERE column_pearson_id = 808;

【讨论】:

  • 您好,史密斯先生。我需要抓住 row_number() 的 valroes 来有序地更新列
  • 您添加了额外的图片。我现在明白了。但认为子查询是错误的。 ?您只需要从该子查询中返回一行。检查我的更新
  • 感谢您的帮助.. 但是您需要使用 order by。我接受这份工作只是为了在另一列中对 valroes 进行数字排序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-22
  • 1970-01-01
  • 2022-11-30
相关资源
最近更新 更多