Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Что раньше, ON или WHERE?  [new]
Studioso
Guest
Вопрос: Ицик Б.Г (а также Дейв), пишут, что сначала выполняется ON

1. FROM
2. ON
3. OUTER
4. WHERE
5. GROUP BY
6. CUBE | ROLLUP
7. HAVING
8. SELECT
9. DISTINCT
10. ORDER BY
11. TOP

Однако почему

Select
From A left join B on A.id = B.a_id
Where B.Type = 'T'

фактически превращает левый джойн во внутренний?
23 авг 17, 14:35    [20744222]     Ответить | Цитировать Сообщить модератору
 Re: Что раньше, ON или WHERE?  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
Studioso,

потому что LEFT JOIN даёт в результате колонки с NULL, если не выполняется ON,
а условие WHERE B.Type = 'T' после этого выбросит эти строки из результирующего набора.
23 авг 17, 14:39    [20744237]     Ответить | Цитировать Сообщить модератору
 Re: Что раньше, ON или WHERE?  [new]
PL SQL Новичок
Member

Откуда:
Сообщений: 79
Вы, возможно, упустили из виду, что при использовании LEFT JOIN
часть строк может иметь значения NULL
(т.е. могут быть такие строки, в которых значение B.Type есть NULL)

Эти строки вы "отсекли" жестоким условием
Where B.Type = 'T'
23 авг 17, 14:40    [20744243]     Ответить | Цитировать Сообщить модератору
 Re: Что раньше, ON или WHERE?  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
Studioso
Ицик Б.Г (а также Дейв), пишут
Главное, что это написано здесь: https://msdn.microsoft.com/ru-ru/library/ms189499(v=sql.100).aspx
23 авг 17, 14:41    [20744247]     Ответить | Цитировать Сообщить модератору
 Re: Что раньше, ON или WHERE?  [new]
Studioso
Guest
iap, о, так понятно. Спасибочки.
23 авг 17, 14:44    [20744262]     Ответить | Цитировать Сообщить модератору
 Re: Что раньше, ON или WHERE?  [new]
aleks222
Guest
Studioso
Вопрос: Ицик Б.Г (а также Дейв), пишут, что сначала выполняется ON


Открою те, студент, страшную тайну!
Это несущественно.
Т.е. не имеет НИКАКОГО практического смысла.
Ваще никакого.
23 авг 17, 20:36    [20745337]     Ответить | Цитировать Сообщить модератору
 Re: Что раньше, ON или WHERE?  [new]
Studioso
Guest
Конечно имеет! Представьте, что вам надо выдать отчет с "итого по продажам за месяц" товаров категории мобильные телефоны.
При этом, если продажи не было, надо выводить ноль по модели.

В одной таблице у вас справочник номенклатуры, в другой накладные по которым вы считаете.
23 авг 17, 22:56    [20745551]     Ответить | Цитировать Сообщить модератору
 Re: Что раньше, ON или WHERE?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20532
Studioso
Конечно имеет!
Нет.
Описанный "порядок выполнения" - всего лишь поддержанная реалиями декларация. То есть результат таков, как будто операции выполнялись именно в таком порядке. Однако всё это никак не говорит о том, как на самом деле будут выполняться операции там, в недрах сервера.
24 авг 17, 07:34    [20745881]     Ответить | Цитировать Сообщить модератору
 Re: Что раньше, ON или WHERE?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50816
Akina
Однако всё это никак не говорит о том, как на самом деле будут выполняться операции там, в недрах сервера.

Об этом говорит конкретный план конкретного запроса. Который и надо изучать вместо всяких Ициков.
24 авг 17, 13:39    [20746946]     Ответить | Цитировать Сообщить модератору
 Re: Что раньше, ON или WHERE?  [new]
o-o
Guest
Dimitry Sibiryakov
Который и надо изучать вместо всяких Ициков.

если кто-то читает, но не понимает написанное,
при чем тут автор написанного?
кстати, почему бы всяким Сибиряковым не издать свои книги ценных советов?
24 авг 17, 13:43    [20746966]     Ответить | Цитировать Сообщить модератору
 Re: Что раньше, ON или WHERE?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20532
Dimitry Sibiryakov
Об этом говорит конкретный план конкретного запроса.

Пока план линеен - да. А когда он раздвояется? какая ветка выполняется раньше - левая или правая? или они выполняются параллельно? Можно даже придумать синтетические случаи, когда это реально будет иметь значение...
24 авг 17, 13:45    [20746979]     Ответить | Цитировать Сообщить модератору
 Re: Что раньше, ON или WHERE?  [new]
invm
Member

Откуда: Москва
Сообщений: 9347
Studioso
Вопрос: Ицик Б.Г (а также Дейв), пишут, что сначала выполняется ON

1. FROM
2. ON
3. OUTER
4. WHERE
5. GROUP BY
6. CUBE | ROLLUP
7. HAVING
8. SELECT
9. DISTINCT
10. ORDER BY
11. TOP
Вы неверно понимаете прочитанное. Это не порядок выполнения, это порядок обработки инструкции select.
Порядок выполнения не регламентирован.
24 авг 17, 14:11    [20747087]     Ответить | Цитировать Сообщить модератору
 Re: Что раньше, ON или WHERE?  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3618
а на практике оптимизатор (нормальный) все что написано в ON разделяет на условия соединения и фильтры не относящиеся к соединению. Потом к ним докидывает where - и при скане(или сике) таблиц перед джоином накладывает все эти фильтры (и из ON и из WHERE) для обеих таблиц. А потом собственно джойнит по условиям соединения
24 авг 17, 14:44    [20747170]     Ответить | Цитировать Сообщить модератору
 Re: Что раньше, ON или WHERE?  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3618
Akina
Dimitry Sibiryakov
Об этом говорит конкретный план конкретного запроса.

Пока план линеен - да. А когда он раздвояется? какая ветка выполняется раньше - левая или правая? или они выполняются параллельно? Можно даже придумать синтетические случаи, когда это реально будет иметь значение...

что за бред ? как он радвояется?? куда?? налево ON направо WHERE ???
24 авг 17, 14:45    [20747175]     Ответить | Цитировать Сообщить модератору
 Re: Что раньше, ON или WHERE?  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
Ivan Durak
а на практике оптимизатор (нормальный) все что написано в ON разделяет на условия соединения и фильтры не относящиеся к соединению. Потом к ним докидывает where - и при скане(или сике) таблиц перед джоином накладывает все эти фильтры (и из ON и из WHERE) для обеих таблиц. А потом собственно джойнит по условиям соединения
Если условие из WHERE перенести в ON LEFT JOINа,
то записи с NULLами для правой таблицы из-за невыполнения условия ON никуда не денутся.
И LEFT JOIN не будет идентичен INNER JOINу.

Однако, в WHERE можно написать B.Type IS NULL OR B.Type = 'T'.
И все прелести LEFT JOINа останутся жить даже при условии, наложенном в WHERE на правую таблицу!
24 авг 17, 14:53    [20747192]     Ответить | Цитировать Сообщить модератору
 Re: Что раньше, ON или WHERE?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3708
o-o
Dimitry Sibiryakov
Который и надо изучать вместо всяких Ициков.

если кто-то читает, но не понимает написанное,
при чем тут автор написанного?
кстати, почему бы всяким Сибиряковым не издать свои книги ценных советов?


в частности, потому, что всякие графоманы типа Бени Ицыка уже понаписывали
24 авг 17, 15:06    [20747237]     Ответить | Цитировать Сообщить модератору
 Re: Что раньше, ON или WHERE?  [new]
CrazyDr1v3r
Guest
http://sqlmag.com/sql-server-2016/logical-query-processing-part-6-where-clause
24 авг 17, 15:41    [20747338]     Ответить | Цитировать Сообщить модератору
 Re: Что раньше, ON или WHERE?  [new]
Dmitry V. Liseev
Member [заблокирован]

Откуда: Санкт-Петербург
Сообщений: 5490
invm
Studioso
Вопрос: Ицик Б.Г (а также Дейв), пишут, что сначала выполняется ON

1. FROM
2. ON
3. OUTER
4. WHERE
5. GROUP BY
6. CUBE | ROLLUP
7. HAVING
8. SELECT
9. DISTINCT
10. ORDER BY
11. TOP
Вы неверно понимаете прочитанное. Это не порядок выполнения, это порядок обработки инструкции select.
Порядок выполнения не регламентирован.
Тем не менее, может влиять на результат:
SET NOCOUNT ON;

CREATE TABLE #t(a INT);

INSERT INTO #t VALUES(1),(2),(0),(3)

-- Ошибки деления на 0 нет.
SELECT 100.0 / #t.a
FROM #t
WHERE #t.a <> 0;

-- Ошибки деления на 0 нет.
SELECT TOP 1 100.0 / #t.a
FROM #t
ORDER BY #t.a DESC

-- А вот тут ошибка деления 0.
SELECT TOP 1 100.0 / #t.a
FROM #t
ORDER BY #t.a * 1.0 DESC

DROP TABLE #t;
GO
24 авг 17, 15:48    [20747360]     Ответить | Цитировать Сообщить модератору
 Re: Что раньше, ON или WHERE?  [new]
invm
Member

Откуда: Москва
Сообщений: 9347
Dmitry V. Liseev
Тем не менее, может влиять на результат
Разницу между "порядок выполнения" и "порядок обработки" осознаете?

Даже если не осознаете, покажите где в вашем примере "порядок выполнения" различен для двух последних select, согласно перечня из стартового поста.
24 авг 17, 17:38    [20747665]     Ответить | Цитировать Сообщить модератору
 Re: Что раньше, ON или WHERE?  [new]
o-o
Guest
invm
Даже если не осознаете, покажите где в вашем примере "порядок выполнения" различен для двух последних select, согласно перечня из стартового поста.

Лучше пусть покажет, где в его однотабличном примере ON
24 авг 17, 20:56    [20747934]     Ответить | Цитировать Сообщить модератору
 Re: Что раньше, ON или WHERE?  [new]
invm
Member

Откуда: Москва
Сообщений: 9347
o-o
Лучше пусть покажет, где в его однотабличном примере ON
В set nocount on
24 авг 17, 21:47    [20748005]     Ответить | Цитировать Сообщить модератору
 Re: Что раньше, ON или WHERE?  [new]
o-o
Guest
invm
o-o
Лучше пусть покажет, где в его однотабличном примере ON
В set nocount on

Картинка с другого сайта.
24 авг 17, 22:24    [20748048]     Ответить | Цитировать Сообщить модератору
 Re: Что раньше, ON или WHERE?  [new]
Uridian
Member

Откуда: Lobnya
Сообщений: 216
iap
Если условие из WHERE перенести в ON LEFT JOINа,
то записи с NULLами для правой таблицы из-за невыполнения условия ON никуда не денутся.
И LEFT JOIN не будет идентичен INNER JOINу.

Однако, в WHERE можно написать B.Type IS NULL OR B.Type = 'T'.
И все прелести LEFT JOINа останутся жить даже при условии, наложенном в WHERE на правую таблицу!


Это не совсем верно. Смотрите сами
use tempdb
go
create table A (a char(1))
insert A values ('A'), ('B'), ('C')
create table B (b char(1))
insert B values ('A'), ('B')
go
select * from A left join B on A.a = B.b and B.b = 'B'
select * from A left join B on A.a = B.b where B.b is null or B.b = 'B'
25 авг 17, 12:45    [20749046]     Ответить | Цитировать Сообщить модератору
 Re: Что раньше, ON или WHERE?  [new]
aleks222
Guest
Uridian
iap
Если условие из WHERE перенести в ON LEFT JOINа,
то записи с NULLами для правой таблицы из-за невыполнения условия ON никуда не денутся.
И LEFT JOIN не будет идентичен INNER JOINу.

Однако, в WHERE можно написать B.Type IS NULL OR B.Type = 'T'.
И все прелести LEFT JOINа останутся жить даже при условии, наложенном в WHERE на правую таблицу!


Это не совсем верно. Смотрите сами
use tempdb
go
create table A (a char(1))
insert A values ('A'), ('B'), ('C')
create table B (b char(1))
insert B values ('A'), ('B')
go
select * from A left join B on A.a = B.b and B.b = 'B'
select * from A left join B on A.a = B.b where B.b is null or B.b = 'B'


Просто надо писать ПРАВИЛЬНО
select * from A left join B on A.a = B.b and B.b = 'B'
-- суть
select * from A left join ( select * from B where b = 'B' ) as B on A.a = B.b 


И фсе очевидно.
25 авг 17, 13:47    [20749269]     Ответить | Цитировать Сообщить модератору
 Re: Что раньше, ON или WHERE?  [new]
CrazyDr1v3r
Guest
aleks222
Просто надо писать ПРАВИЛЬНО
select * from A left join B on A.a = B.b and B.b = 'B'
-- суть
select * from A left join ( select * from B where b = 'B' ) as B on A.a = B.b 


И фсе очевидно.


Или так:

select * from A left join B on A.a = B.b and (B.b is null or B.b = 'B')
25 авг 17, 15:43    [20749712]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить