2014-09-19 2 views
2

Я попытался сделать оператор UPDATE со случайной строкой из другой таблицы. Я знаю, что этот вопрос задан раньше (here), но он, похоже, не работает для меня.UPDATE случайная строка из другой таблицы SQL Server 2014

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

UPDATE dbo.TABLE_CHARGE 
SET COLRW_STREET = 
    (SELECT TOP 1 COLRW_STREET FROM CHIEF_PreProduction.dbo.TABLE_FAKESTREET 
    ORDER BY ABS(CHECKSUM(NewId())%250)) 

Заранее благодарен!

+1

Что именно не работает и где оно было задано раньше? – Bulat

+0

Спасибо за ваш ответ! Я отредактировал мой вопрос. Часть, которая не работает, является частью, где она обновляет случайные значения. Это занимает случайное значение, но только одно. После этого случайные значения вставляются в каждое место. URL-адрес примерно с тем же вопросом: http://goo.gl/pyHuhG – user3208216

+0

Разница с указанной вами ссылкой - это обновление из другой таблицы, и это отлично работает в SQLServer 2008 и SQLServer 2012 http://sqlfiddle.com/ #! 3/ab537/1 – bummi

ответ

3

Я позволил предположить, что у вас есть поле ID в таблице TABLE_CHARGE. Это, вероятно, не самый эффективный способ, но, кажется, работает:

WITH random_values as 
(
SELECT t.id, t.COLRW_STREET, t.random_street FROM (
    SELECT c.id, c.COLRW_STREET, 
    f.COLRW_STREET as random_street, ROW_NUMBER() OVER (partition by c.id ORDER BY ABS(CHECKSUM(NewId())%250)) rn 
    FROM table_charge c, TABLE_FAKESTREET f) t 
    WHERE t.rn = 1 
) 
UPDATE random_values SET COLRW_STREET = random_street; 

SQL Fiddle demo

Ваш исходный код не работает, потому что, когда йо делать ... SET x = (SELECT TOP 1 ..) баз данных делают OUTER JOIN вашей целевой таблицы с одной верхней строкой, которая означает, что одна строка применяется ко всем строкам целевой таблицы. Следовательно, у вас одинаковое значение во всех строках.

После запроса показывает, что происходит в UPDATE:

SELECT * FROM 
    TABLE_CHARGE tc, 
    (SELECT TOP 1 COLRW_STREET as random_street FROM TABLE_FAKESTREET 
     ORDER BY ABS(CHECKSUM(NewId())%250)) t 

Мое решение становится все фальшивые записи заказанные случайно для каждой записи в таблице назначения и выбирает только первый за идентификатору.

+0

Я не знаю, что это делает, если честно. Я не очень хорошо знаком с CTE. Он работает действительно, так что спасибо! – user3208216

+0

Я обновил свой ответ, надеюсь, что это поможет понять мое решение – Bulat

+0

Спасибо! Я понимаю это намного больше сейчас :) – user3208216

Смежные вопросы