Внешнее применение (и перекрестное применение) к тому же результату таблицы - PullRequest
1 голос
/ 25 октября 2019

Учитывая следующий сценарий (с SQL Server 2017):

declare @mytable as table (n int identity(1,1), name varchar(10),mydate  date)
insert into @mytable(name,mydate) values('a','01/01/2019')

select * from @mytable t1
cross apply (select   * from t1 ) t2;

select *,mydate from @mytable t1
cross apply (select   * from t1 ) t2

Как объяснить, что

  1. Я получаю 5 строк

  2. Столбцы 1 и 2 имеют имена c1 и c2 вместо оригинальных имен в @mytable

  3. Я не получаю mydate в первом сценарии и получаюэто только если я напишу это (* недостаточно)

  4. "это текст" возвращается в строках со 2 по 5 => как это объяснить?

enter image description here

1 Ответ

1 голос
/ 25 октября 2019

Ваше CROSS APPLY определение - select * from t1 - это не выбирает псевдоним, определенный выше. Вместо этого он ищет таблицу с именем t1 и выбирает из нее - это никоим образом не коррелирует с остальной частью запроса.

Если вы хотите APPLY значения из текущей строки псевдонимастол, который вам нужно будет сделать

select * from @mytable t1
cross apply (select   t1.*  ) t2;

без FROM.

Это ведет себя так, как вы ожидали.

...