Обновить все строки столбцов со случайными значениями из другой таблицы в Snowflake - PullRequest
0 голосов
/ 12 октября 2018

Мне нужно обновить все строки столбца случайными значениями, выбранными из другой таблицы.Я пытаюсь выполнить следующий запрос -

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

Подзапрос дает мне случайный город при выполнении отдельно, но в приведенном выше случае все строки обновляются с одинаковым значением.

Я также пытался выбратьслучайные записи по идентификатору, как показано ниже, но это также обновляет все строки с одинаковым значением -

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 голосов
/ 15 октября 2018

Следующий запрос работал для меня.Я использовал хэш для имени столбца, чтобы обновление работало во всех строках моего столбца -

ОБНОВЛЕНИЕ "TEST_CITY" SET "CITY" = C. "ИМЯ" ИЗ ГОРОДА C ГДЕ C. "ID"= ABS (HASH (" CITY ")% 16917) + 1;

16197 - это количество строк в таблице City.

Спасибо

0 голосов
/ 16 ноября 2018

Ниже код запускается для меня

UPDATE TEST_CITY a  SET a.CITY = b.NAME FROM (
SELECT NAME ,row_number()  over (order by random()) AS id from CITY) b;
0 голосов
/ 12 октября 2018

Я не знаю конкретно для Snowflake, но другие базы данных иногда оптимизируют подзапросы с помощью функции volatile, что приводит к единственному значению.

Одним из решений, которое я видел, является использование коррелированного подзапроса:

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
                 );
...