Почему newid () материализуется в самом конце запроса? - PullRequest
1 голос
/ 01 июля 2011

Если вы запустите следующий пример кода в SQL Server, вы заметите, что newid () материализуется после объединения, тогда как row_number () материализуется до объединения. Кто-нибудь это понимает и есть ли способ обойти это?

declare @a table ( num varchar(10) )
 insert into @a values ('dan')
 insert into @a values ('dan')
 insert into @a values ('fran')
 insert into @a values ('fran')

 select *
   from @a T
            inner join
        (select num, newid() id
           from @a
          group by num) T1      on T1.num = T.num         

 select *
   from @a T
            inner join
        (select num, row_number() over (order by num) id
           from @a
          group by num) T1      on T1.num = T.num

Ответы [ 2 ]

1 голос
/ 13 мая 2013

У меня была похожая проблема, и я обнаружил, что проблема заключалась в «внутреннем соединении».я смог использовать "левые соединения" ...

0 голосов
/ 01 июля 2011

Не уверен, что вижу здесь проблему. Сначала материализуйте подзапрос T1:

SELECT num, ROW_NUMBER() OVER (ORDER BY num) 
    FROM @a
    GROUP BY num;

Вы получите две строки:

dan  1
fran 2

Теперь присоединитесь к a on num = num, и вы получите 4 строки, 2 для каждого отдельного значения. Какова ваша настоящая цель здесь? Возможно, вам следует применять ROW_NUMBER () снаружи?

Порядок материализации зависит от оптимизатора. Вы обнаружите, что другие встроенные модули (RAND (), GETDATE () и т. Д.) Имеют аналогично несовместимое поведение материализации. Мало что вы можете с этим поделать, и мало шансов, что они это "исправят".

EDIT

Новый пример кода. Запишите содержимое @a в таблицу #temp, чтобы «материализовать» назначение NEWID () для каждого уникального значения num.

SELECT num, id = NEWID() 
  INTO #foo FROM @a GROUP BY num;

SELECT a.num, f.id 
  FROM @a AS a 
  INNER JOIN #foo AS f 
  ON a.num = f.num;

DROP TABLE #foo;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...