Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Проста инструкция за актуализиране, така че на всички редове да се присвоява различна стойност

На някои тестови таблици от моя страна вашият оригинален план изглежда по следния начин.

Той просто изчислява резултата веднъж и го кешира в sppol, след което възпроизвежда този резултат. Можете да опитате следното, така че SQL Server да вижда подзаявката като корелирана и нуждаеща се от преоценка за всеки външен ред.

UPDATE table1
SET    table2Id = (SELECT TOP 1 table2Id
                   FROM   table2
                   ORDER  BY Newid(),
                             table1.table1Id)

За мен това дава този план без макарата.

Важно е да се направи корелация в уникално поле от table1 но така, че дори ако се добави макара, тя винаги трябва да се връща назад, а не да се навива (възпроизвеждане на последния резултат), тъй като корелационната стойност ще бъде различна за всеки ред.

Ако таблиците са големи, това ще бъде бавно, тъй като необходимата работа е продукт на двата реда на таблицата (за всеки ред в table1 трябва да направи пълно сканиране на table2 )



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Защо ISNUMERIC(',') е вярно?

  2. репликация между две таблици с различни имена и които имат различни имена на колони. Възможно ли е да се създаде такава репликация

  3. SQL заявка за групиране по ден

  4. Разделете думи с главна буква в sql

  5. Как да използвате сортиране (Поръчайте по) в Select Statement в SQL Server - SQL Server / TSQL Урок, част 109