powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос с cross apply
15 сообщений из 15, страница 1 из 1
Запрос с cross apply
    #40115289
Диана Орел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Почему такой запрос работает?

Код: sql
1.
2.
select * from dbo.T_BRANCH_SNST as br
cross apply (select  [name]+ ',,,,,' as field1)as t1



работает при условии, что определен псевдоним выражения в скобках после cross apply t1; определен псевдоним field1
...
Рейтинг: 0 / 0
Запрос с cross apply
    #40115299
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Диана Орел,

работает потому, что выражение синтаксически допустимое.
Почему требуется указывать field1? Это необходимо согласно требований реляционной механики.
...
Рейтинг: 0 / 0
Запрос с cross apply
    #40115317
Диана Орел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов
Диана Орел,

работает потому, что выражение синтаксически допустимое.
Почему требуется указывать field1? Это необходимо согласно требований реляционной механики.


Я могу зазубрить, но хочется понять. Как SQL Server знает, что name из таблицы dbo.T_branch_snst? cross apply с правой стороны использует или табличную функцию или подзапрос.
Где в MSDN такое написано?
...
Рейтинг: 0 / 0
Запрос с cross apply
    #40115327
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Диана Орел
Как SQL Server знает, что name из таблицы dbo.T_branch_snst


Потому что больше неоткуда.
...
Рейтинг: 0 / 0
Запрос с cross apply
    #40115336
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Диана Орел
Где в MSDN такое написано?
Написано прямо в описании синтаксиса
https://docs.microsoft.com/en-us/sql/t-sql/queries/select-transact-sql?view=sql-server-ver15
То, что в квадратных скобках, необязательно, то есть обязательно только
Код: sql
1.
SELECT select_list 
...
Рейтинг: 0 / 0
Запрос с cross apply
    #40115804
Диана Орел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg,
перечитав ссылку в msdn выполняется запрос так:
1. from
2. cross apply
3. select, который в скобках
4. select, который первый стоит.
Шаги 2 и 3 повторяются для каждой строки внешнего запроса. Такой алгоритм?
...
Рейтинг: 0 / 0
Запрос с cross apply
    #40115831
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
https://docs.microsoft.com/en-us/sql/t-sql/queries/from-transact-sql?view=sql-server-ver15 left_table_source { CROSS | OUTER } APPLY right_table_source

Specifies that the right_table_source of the APPLY operator is evaluated against every row of the left_table_source . This functionality is useful when the right_table_source contains a table-valued function that takes column values from the left_table_source as one of its arguments.

When OUTER is specified, one row is produced for each row of the left_table_source even when the right_table_source evaluates against that row and returns an empty result set.
...
Рейтинг: 0 / 0
Запрос с cross apply
    #40115848
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Диана Орел
Владислав Колосов
Диана Орел,

работает потому, что выражение синтаксически допустимое.
Почему требуется указывать field1? Это необходимо согласно требований реляционной механики.


Я могу зазубрить, но хочется понять. Как SQL Server знает, что name из таблицы dbo.T_branch_snst?
cross apply с правой стороны использует или табличную функцию или подзапрос.
Где в MSDN такое написано?


Хде написано - я уже не помню.
Но разрешение не полностью квалифицированных имен полей вложенных запросов идет так:
1. Из "ближайших" таблиц этого подзапроса .
если не найдено
2. Из таблиц уровнем выше.
если не найдено
3. Из таблиц уровнем еще выше.
...

Не желаете это учить - не пишите

[name]
.
Пишите ВСЕГДА

alias.[name]

Иначе надо быть всегда готовым к варианту: я добавил поле в табличку - все запросы базы сломались.
...
Рейтинг: 0 / 0
Запрос с cross apply
    #40115920
Диана Орел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222, это интересно, спасибо
...
Рейтинг: 0 / 0
Запрос с cross apply
    #40115946
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
Но разрешение не полностью квалифицированных имен полей вложенных запросов идет так:
1. Из "ближайших" таблиц этого подзапроса .
если не найдено
2. Из таблиц уровнем выше.
если не найдено
3. Из таблиц уровнем еще выше.
...

А если найдено несколько одинаковых в разных таблицах, то вылетит птичка "Ambiguous column name '...'". Так что лучше всегда использовать алиасы.
...
Рейтинг: 0 / 0
Запрос с cross apply
    #40115957
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны
А если найдено несколько одинаковых в разных таблицах, то вылетит птичка "Ambiguous column name '...'". Так что лучше всегда использовать алиасы.


Далеко не всегда

В контексте вопрос (cross apply), скорее нет, чем да.
...
Рейтинг: 0 / 0
Запрос с cross apply
    #40115991
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
Не желаете это учить - не пишите

[name]
.
Пишите ВСЕГДА

alias.[name]
Я бы даже сказал "всегда, даже зная точно, откуда что берётся".
Не надо писать квесты, что бы потом программисты, реализуя какое то плёвое бизнес-требование, долго и нужно вычитывали запрос, который, возможно, на один экран не помещается.
Привычка должна быть: если больше одной таблицы - алиас обязателен, если одна - желателен.
...
Рейтинг: 0 / 0
Запрос с cross apply
    #40116029
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex

Далеко не всегда

В контексте вопрос (cross apply), скорее нет, чем да.

А можно пример для случая, когда скорее нет? Я сам такой придумать не могу. Получается только что-то типа такого:
Код: sql
1.
2.
3.
4.
5.
6.
7.
select f.name
from sys.tables t
join sys.columns c on c.object_id=t.object_id
join sys.indexes i on i.object_id=t.object_id
cross apply (
  select quotename(name)
) f(name)


Код: plaintext
1.
Msg 209, Level 16, State 1, Line 6
Ambiguous column name 'name'.
...
Рейтинг: 0 / 0
Запрос с cross apply
    #40116042
Диана Орел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В msdn
авторUsing APPLY
Both the left and right operands of the APPLY operator are table expressions. The main difference between these operands is that the right_table_source can use a table-valued function that takes a column from the left_table_source as one of the arguments of the function. The left_table_source can include table-valued functions, but it cannot contain arguments that are columns from the right_table_source. ответ на мой вопрос. Спасибо, Akina
...
Рейтинг: 0 / 0
Запрос с cross apply
    #40116045
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны
А можно пример для случая, когда скорее нет?


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create table #t1(f1 int, f2 int)
create table #t2(f1 int)

insert #t1 values(1,1)
insert #t2 values (2)

select *
from #t1
cross apply(
	select f1, f2
	from #t2
) a

drop table #t1
drop table #t2
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос с cross apply
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]