Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
 Re: Соединение текстового поля и чифрового  [new]
iap
Member

Откуда: Москва
Сообщений: 47009
uaggster
iap
пропущено...
Имеется в виду логический порядок выполнения запроса?
Но он не обязан совпадать с физическим. И часто не совпадает.
Устройство оптимизатора изнутри мы не знаем, поэтому невозможно определённо сказать, что он предпочтёт.
Считается, что главное, чтобы результат был тем же, что и при выполнении запроса в логическом порядке.

Ага, логический.
Ведь согласно логического порядка (подчеркиваю) запрос должен завершиться с ошибкой? Преобразование 'bla-bla' к int при соединении выполнить невозможно, так ведь?
Значит должен упасть. Ну, если не падает - будем скорбеть, но писать так всё равно не будем.
select *
  from Points as P
       join Checks as C on 
       Case when ISNUMERIC(C.Point) = 1 then C.Point Else Null End = P.ID


Вот так оно логически (подчеркиваю) - будет работать правильно.
Ну, с точностью до ',,' , конечно.
Поэтому надо ещё LIKE приделать.
Об этом тут уйма тем открыто.
12 дек 16, 16:42    [19994367]     Ответить | Цитировать Сообщить модератору
 Re: Соединение текстового поля и чифрового  [new]
iap
Member

Откуда: Москва
Сообщений: 47009
iap
Поэтому надо ещё LIKE приделать.
Об этом тут уйма тем открыто
Хотя, конечно, в последнее время появились всякие try_cast и try_convert.
C ними ничего этого не надо, разумеется. Хотя, как знать...
12 дек 16, 16:44    [19994378]     Ответить | Цитировать Сообщить модератору
 Re: Соединение текстового поля и чифрового  [new]
uaggster
Member

Откуда:
Сообщений: 881
TaPaK
uaggster
iap, согласно порядка выполнения инструкций запроса sql - фильтрация идет всяко позже соединения.
И то, что сервер может объединять эти две операции в одну - его личное дело.

Такая операция ДОЛЖНА давать ошибку.
Если не дает не всегда... Ну плохо, чо... будем с этим жить.
Только надеяться, что не даст - не нужно.

Я думаю так.
:-)


select *
  from Points as P
       join Checks as C on C.Point = P.ID
 where ISNUMERIC(C.Point) = 1

переписать в

select *
  from Points as P
       join Checks as C on C.Point = P.ID AND  ISNUMERIC(C.Point) = 1

будет по другому?? а если ?

select *
  from Points as P
       join Checks as C on C.Point = P.ID AND  ISNUMERIC(P.ID) = 1


в каком порядке всё будет ? я не могу сказать

Согласно документации - в том порядке, как сервер решит.
Чисто Сишный подход к вычислению логических и арифметических операций, имеющих равный приоритет.
Так что таким образом переписывать - бесполезно. Таким образом должно падать.
12 дек 16, 17:19    [19994548]     Ответить | Цитировать Сообщить модератору
 Re: Соединение текстового поля и чифрового  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
uaggster,
переобуваемся на ходу
автор
Соединение производится первой операцией, фильтрация - в общем случае - потом.
12 дек 16, 17:21    [19994554]     Ответить | Цитировать Сообщить модератору
 Re: Соединение текстового поля и чифрового  [new]
uaggster
Member

Откуда:
Сообщений: 881
Вот с вышепреведенным Case - будет работать всегда и железно. Потому что операторы Case обрабатываются в порядке от первого к последнему.
Try_parse / tru_cast в общем, и никаких лайков.
12 дек 16, 17:23    [19994559]     Ответить | Цитировать Сообщить модератору
 Re: Соединение текстового поля и чифрового  [new]
uaggster
Member

Откуда:
Сообщений: 881
TaPaK
uaggster,
переобуваемся на ходу
автор
Соединение производится первой операцией, фильтрация - в общем случае - потом.


MSDN
Логический порядок обработки инструкции SELECT
Следующие действия демонстрируют логический порядок обработки или порядок привязки инструкции SELECT. Этот порядок определяет, когда объекты, определенные в одном шаге, становятся доступными для предложений в последующих шагах. Например, если обработчик запросов можно привязать (для доступа) к таблицам или представлениям, определенным в предложении FROM, эти объекты и их столбцы становятся доступными для всех последующих шагов. И наоборот, поскольку предложение SELECT является шагом 8, любые псевдонимы столбцов или производных столбцов, определенные в этом предложении, не могут быть объектом для ссылки предыдущих предложений.
Conversely, because the SELECT clause is step 8, any column aliases or derived columns defined in that clause cannot be referenced by preceding clauses.
Вместе с тем к ним могут обращаться последующие предложения, например предложение ORDER BY. Обратите внимание, что фактическое физическое выполнение оператора определяется обработчиком запросов и порядок из этого списка может значительно отличаться.
FROM
ON
JOIN
WHERE
GROUP BY
WITH CUBE или WITH ROLLUP
HAVING
SELECT
DISTINCT
ORDER BY
В начало



https://msdn.microsoft.com/ru-ru/library/ms189499.aspx
12 дек 16, 17:26    [19994575]     Ответить | Цитировать Сообщить модератору
 Re: Соединение текстового поля и чифрового  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
uaggster,

для медленных
автор
Следующие действия демонстрируют логический порядок обработки или порядок привязки инструкции SELECT. Этот порядок определяет, когда объекты, определенные в одном шаге, становятся доступными для предложений в последующих шагах.

и повторяю если переписать всё в JOIN порядок поменяется? или всё в where? а если порядок в where переставить?
13 дек 16, 10:11    [19996239]     Ответить | Цитировать Сообщить модератору
 Re: Соединение текстового поля и чифрового  [new]
uaggster
Member

Откуда:
Сообщений: 881
TaPaK
uaggster,

для медленных
автор
Следующие действия демонстрируют логический порядок обработки или порядок привязки инструкции SELECT. Этот порядок определяет, когда объекты, определенные в одном шаге, становятся доступными для предложений в последующих шагах.

и повторяю если переписать всё в JOIN порядок поменяется? или всё в where? а если порядок в where переставить?

Еще раз повторяю, для быстрых - в каком порядке энжин будет выполнять равноприоритетные операции "на одном этаже" - его личное дело. Это отражено в документации.
join и where - находятся на разных этажах. join, согласно стандарта всегда выполняется до where.

Поэтому все три варианта - одинаково неверны.
select *
  from Points as P
       join Checks as C on C.Point = P.ID
 where ISNUMERIC(C.Point) = 1

select *
  from Points as P
       join Checks as C on C.Point = P.ID AND  ISNUMERIC(C.Point) = 1

select *
  from Points as P
       join Checks as C on C.Point = P.ID AND  ISNUMERIC(P.ID) = 1

Первый - потому что преобразование должно выполняться ДО фильтрации
Второй - потому что мы не можем гарантировать, что выполнится первым C.Point = P.ID или ISNUMERIC(C.Point) = 1 в выражении (и должны исходить из того, что они выполняются одновременно).
Третий пример - не при делах, т.к. P.ID по условиям - int.

Если первый или второй примеры по какой то причине не падают - это нарушение стандарта. Примите соболезнования.
13 дек 16, 14:08    [19997360]     Ответить | Цитировать Сообщить модератору
 Re: Соединение текстового поля и чифрового  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
uaggster,

вы даже суть написанного в документации не способны постичь.
Описана доступность описанных объектов...
это вообще надо в раздел анекдоты
автор
join и where - находятся на разных этажах. join, согласно стандарта всегда выполняется до where.


вы способны посмотреть план ?
CREATE TABLE #a
(
	Id INT
)

CREATE TABLE #b
(
	Id INT
)

SELECT 
*
FROM 
	#a a
JOIN
	#b b 
ON
	a.Id = b.Id
WHERE 
	a.Id = 3
13 дек 16, 14:17    [19997491]     Ответить | Цитировать Сообщить модератору
 Re: Соединение текстового поля и чифрового  [new]
uaggster
Member

Откуда:
Сообщений: 881
TaPaK
uaggster,

вы даже суть написанного в документации не способны постичь.
Описана доступность описанных объектов...
это вообще надо в раздел анекдоты
автор
join и where - находятся на разных этажах. join, согласно стандарта всегда выполняется до where.


вы способны посмотреть план ?
CREATE TABLE #a
(
	Id INT
)

CREATE TABLE #b
(
	Id INT
)

SELECT 
*
FROM 
	#a a
JOIN
	#b b 
ON
	a.Id = b.Id
WHERE 
	a.Id = 3

А причем тут план выполнения?
План выполнения относится к физическому выполнению запроса. Запрос сервер может выполнять запрос так, как ему заблагорассудится.
Но только результат выполнения должен совпадать с логическим выполнением запроса.
Согласно логическому порядку - join выполняется до where.
И где тут про план?
13 дек 16, 16:09    [19998296]     Ответить | Цитировать Сообщить модератору
 Re: Соединение текстового поля и чифрового  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
uaggster,

автор
А причем тут план выполнения?
План выполнения относится к физическому выполнению запроса. Запрос сервер может выполнять запрос так, как ему заблагорассудится.
Но только результат выполнения должен совпадать с логическим выполнением запроса.
Согласно логическому порядку - join выполняется до where.
И где тут про план?

то тут скажешь... Даже Лаврова захотелось процитировать...
вам явно не доступно осилить это
автор
Этот порядок определяет, когда объекты, определенные в одном шаге, становятся доступными для предложений в последующих шагах.
13 дек 16, 16:15    [19998338]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
Все форумы / Microsoft SQL Server Ответить