使用雪花中另一个表中的随机值更新所有列行

时间:2018-10-12 06:36:41

标签: sql snowflake

我需要使用从另一张表中选择的随机值来更新列的所有行。我正在尝试跟踪查询-

UPDATE TEST_CITY
    SET "CITY" = (SELECT NAME FROM CITY SAMPLE (1 rows))

子查询在单独执行时会给我一个随机的城市,但在上述情况下,所有行都使用相同的值进行更新。

我还试图像下面那样通过id选择随机记录,但这也会更新具有相同值的所有行-

UPDATE TEST_CITY
    SET "CITY" = (select c.name
                  from city c
                  where c.id = (SELECT uniform(1, 50, random()))
                 )

例如,该查询更新具有不同随机值的所有行-

UPDATE TEST_CITY
    SET "name" = to_varchar(ABS(MOD(RANDOM(1), 1000000)))

当随机值是字符串并且应该来自单独的表时,我可以有与此等效的东西吗?

3 个答案:

答案 0 :(得分:1)

我不特别了解Snowflake,但是其他数据库有时会使用易失性函数优化子查询,从而产生单个值。

我见过的一种解决方案是使用相关子查询:

UPDATE TEST_CITY
    SET "CITY" = (select c.name
                  from city c
                  where c.id = (SELECT uniform(1, 50, random())) AND
                        test_city.city is not null -- any condition should do
                 );

尽管性能可能会变差,但也许order by可以工作:

UPDATE TEST_CITY
    SET "CITY" = (select c.name
                  from city c
                  order by random()
                  limit 1
                 );

答案 1 :(得分:0)

以下查询对我有用。我已经使用列名称上的哈希值来使更新适用于列的所有行-

  

更新“ TEST_CITY”设置“ CITY” =C。“ NAME”从C所在的C所在的城市。“ ID” =   ABS(HASH(“ CITY”)%16917)+1;

16197是我在“城市”表中的行数。

谢谢

答案 2 :(得分:0)

下面的代码为我运行

UPDATE TEST_CITY a  SET a.CITY = b.NAME FROM (
SELECT NAME ,row_number()  over (order by random()) AS id from CITY) b;
相关问题