【问题标题】:SQL Updating with random subselect everytime, giving me same value for all rows每次使用随机子选择进行 SQL 更新,为所有行提供相同的值
【发布时间】:2021-06-23 13:17:16
【问题描述】:

我有一列有 90% 的空值,我试图每次使用剩余的 10% 随机选择一个值,并用它来填充完全相同的表中缺失的值。

这是我的桌子

我在 PostgreSQL 上使用这个查询:

UPDATE public."Assure"
SET   "codePostal" = ( 
    SELECT "codePostal" 
      FROM public."Assure"
      WHERE "codePostal" is not NULL
      ORDER BY random() * public."Assure"."CodeAssure_id"
      LIMIT 1 )
WHERE "codePostal" is NULL

结果:

【问题讨论】:

  • 嗯。那不是在做你想做的事吗?另外,这是一个很奇怪的要求。
  • 他们现在设置的方式是从子查询中返回一个值并将其用于UPDATE 具有codePostal IS NULL 的所有行到该值。
  • @Error_2646 我试图每次都用不同的值更新空值
  • @AdrianKlaver 如何设置它以获得每一行的不同值?
  • 好的,我明白你在说什么。

标签: sql postgresql random sql-update subquery


【解决方案1】:

你可以使用窗口函数:

update assure a
    set codePostal = a2.codePostal
    from (select a2.*,
                 row_number() over (order by random()) as seqnum,
                 count(*) over () as cnt
          from assure a2
          where codePostal is not null
         ) a2 join
         (select a3.*,
                 row_number() over (order by random()) as seqnum
          from assure a3
          where codePostal is null
         ) a3
         on (a3.seqnum % a2.cnt) = a2.seqnum - 1
    where a3.codeassure_id = a.codeassure_id;

除了做你真正想做的事情之外,另一个优点是这不需要对分配了值的每一行的所有非NULL 值进行排序。

Here 是一个说明工作代码的 dbfiddle。

【讨论】:

  • 由于某种原因,我得到:错误:“来自”第 2 行或附近的语法错误:来自(选择 a2.*,^ 我该如何解决?
  • @4212 。 . .如果没有setupdate 就不是很有用。我添加了缺少的子句。
  • 我编辑了我的帖子以放置显示我无法修复的错误的图像,希望您能帮助我并删除它
  • @4212 。 . .我修正了一个错字并添加了一个 dbfiddle.
  • 谢谢!非常感谢您,先生
【解决方案2】:

如果您只为更新的表和子查询中的表设置别名,您的代码就可以了:

UPDATE Assure a1
SET codePostal = ( 
      SELECT a2.codePostal 
      FROM Assure a2
      WHERE a2.codePostal IS NOT NULL
      ORDER BY RANDOM() * a1.CodeAssure_id
      LIMIT 1)
WHERE a1.codePostal IS NULL

请参阅demo

【讨论】:

  • 感谢您的回答,您的解决方案很有意义,我试过了,它只是一直执行,表中有 0 个更改(与其他答案相同)。老实说,我认为我放弃了,我正在寻找另一种方法,看起来像是 PostgreSQL 本身或 idk 中的问题 ..
  • @4212 你的桌子有多大?
  • 1M 行,其中 25K 行具有非 NULL“codePostal”值。当我删除“* a1.CodeAssure_id”并将其保留为“ORDER BY RANDOM()”时,它会在几秒钟内执行(对于我试图避免的所有行,ofc 具有相同的值)
  • @4212 用 cte 试试:dbfiddle.uk/…
  • 同理,一直执行查询,没有输出
猜你喜欢
  • 2016-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-04
  • 1970-01-01
  • 2023-03-18
相关资源
最近更新 更多