Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Последовательность JOIN ... ON  [new]
DenisA
Member

Откуда:
Сообщений: 154
Запрос выдает разные результаты при разном расположении JOIN ON
Например:
1) Первый запрос
select t1.ID, t2.name, t3.description
from t1 LEFT JOIN t2
ON t1.ID = t2.ID
left join t3 on
t2.ID = t3.ID
2) Второй запрос
select t1.ID, t2.name, t3.description
from t1 LEFT JOIN t2
left join t3
ON t1.ID = t2.ID
ON t2.ID = t3.ID

Запросы выдают разные результаты.
Кто может грамотно разъснить ситуацию?
Помогите.
Спасибо.
17 ноя 03, 13:20    [420792]     Ответить | Цитировать Сообщить модератору
 Re: Последовательность JOIN ... ON  [new]
iSestrin
Member

Откуда: Новосибирск
Сообщений: 3811
"разные результаты" обнаружено глазками?
количество записей одинаково?
может отсортировать, чтобы легче различия увидеть?
17 ноя 03, 13:44    [420855]     Ответить | Цитировать Сообщить модератору
 Re: Последовательность JOIN ... ON  [new]
DenisA
Member

Откуда:
Сообщений: 154
разные результаты - это количество строк разные!!!
17 ноя 03, 13:48    [420872]     Ответить | Цитировать Сообщить модератору
 Re: Последовательность JOIN ... ON  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
я может чего-то не понял: а почему, собственно, эти запросы должны выдавать одинаковый результат??? то есть, если бы там были inner join-ы, я бы еще понял, а так...
17 ноя 03, 13:52    [420883]     Ответить | Цитировать Сообщить модератору
 Re: Последовательность JOIN ... ON  [new]
iSestrin
Member

Откуда: Новосибирск
Сообщений: 3811
хм, а почему они должны выдавать разный? - в обеих синтаксических конструкциях джойнятся слева направо t1, t2, t3 в одном и том же порядке...

2DenisA
пример явно искуственный, может в реальном случае какие-то условия есть или еще что-либо?
17 ноя 03, 14:02    [420908]     Ответить | Цитировать Сообщить модератору
 Re: Последовательность JOIN ... ON  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
iSestrin писал:
хм, а почему они должны выдавать разный

потому, что условия присоединения t2 к t1 в этих запросах разные. В первом случае:
ON t1.ID = t2.ID

а во втором никакого условия нет вообще - то есть, каждой записи из t1 проставляется в соответствие каждая запись из t2.
17 ноя 03, 14:09    [420928]     Ответить | Цитировать Сообщить модератору
 Re: Последовательность JOIN ... ON  [new]
DenisA
Member

Откуда:
Сообщений: 154
Так все же как правильно и почему разные результаты?
Где бы почитать о такой проблеме больше материала?
17 ноя 03, 14:15    [420941]     Ответить | Цитировать Сообщить модератору
 Re: Последовательность JOIN ... ON  [new]
iSestrin
Member

Откуда: Новосибирск
Сообщений: 3811
2 daw
а подумать?

вот это что:
ON t1.ID = t2.ID
ON t2.ID = t3.ID

???


2 DenisA
select @@version
?
17 ноя 03, 14:20    [420952]     Ответить | Цитировать Сообщить модератору
 Re: Последовательность JOIN ... ON  [new]
DenisA
Member

Откуда:
Сообщений: 154
Microsoft SQL Server 2000 - 8.00.760 (Intel X86) Dec 17 2002 14:22:05 Copyright (c) 1988-2003 Microsoft Corporation Enterprise Edition on Windows NT 5.0 (Build 2195: Service Pack 3)
17 ноя 03, 14:22    [420957]     Ответить | Цитировать Сообщить модератору
 Re: Последовательность JOIN ... ON  [new]
iSestrin
Member

Откуда: Новосибирск
Сообщений: 3811
>2DenisA
пример явно искуственный, может в реальном случае какие-то условия есть или еще что-либо?<
а на этот вопрос можно ответ получить?
17 ноя 03, 14:28    [420978]     Ответить | Цитировать Сообщить модератору
 Re: Последовательность JOIN ... ON  [new]
DenisA
Member

Откуда:
Сообщений: 154
Уловие: WHERE t2.value >100
17 ноя 03, 14:33    [420995]     Ответить | Цитировать Сообщить модератору
 Re: Последовательность JOIN ... ON  [new]
iSestrin
Member

Откуда: Новосибирск
Сообщений: 3811
т.е. ты хочешь сказать, что у тебя в программе таблицы называются t1, t2, ... tN ?
если нет - можно ли увидеть реальные запросы? copy/paste ...
17 ноя 03, 14:44    [421028]     Ответить | Цитировать Сообщить модератору
 Re: Последовательность JOIN ... ON  [new]
Павел Воронцов
Member

Откуда: Новосибирск
Сообщений: 2386
Блог
Можно всё-таки поподробней? Вот Вам рыба, забейте данными чтобы получилась ошибка

set nocount on

create table t1 (id int not null primary key)
create table t2 (id int not null primary key foreign key references t1,
name varchar(10) not null,
value int not null)
create table t3 (id int not null primary key foreign key references t2,
description varchar(10) not null)

insert into t1 values (1)
insert into t1 values (2)
insert into t1 values (3)
insert into t1 values (4)
insert into t2 values (1, 'a', 100)
insert into t2 values (2, 'b', 300)
insert into t2 values (3, 'c', 500)
insert into t3 values (1, 'aq')
insert into t3 values (2, 'bq')

select t1.id, t2.name, t3.description
from t1 LEFT JOIN t2
ON t1.id = t2.id
left join t3 on
t2.id = t3.id
where t2.value > 100

select t1.id, t2.name, t3.description
from t1 LEFT JOIN t2
left join t3
ON t2.id = t3.id
ON t1.id = t2.id
where t2.value > 100


drop table t3
drop table t2
drop table t1
17 ноя 03, 14:46    [421033]     Ответить | Цитировать Сообщить модератору
 Re: Последовательность JOIN ... ON  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31632
2DenisA
А вот "Уловие: WHERE t2.value >100" превращает ваш LEFT JOIN t2... превращает... в INNER JOIN t2!
17 ноя 03, 14:47    [421035]     Ответить | Цитировать Сообщить модератору
 Re: Последовательность JOIN ... ON  [new]
DenisA
Member

Откуда:
Сообщений: 154
Еще есть условие в ON:

1) Первый запрос
select t1.ID, t2.name, t3.description
from t1 LEFT JOIN t2
ON t1.ID = t2.ID and t2.activity = 1
left join t3 on
t2.ID = t3.ID
WHERE t2.value >100

2) Второй запрос
select t1.ID, t2.name, t3.description
from t1 LEFT JOIN t2
left join t3
ON t1.ID = t2.ID and t2.activity = 1
ON t2.ID = t3.ID
WHERE t2.value >100
17 ноя 03, 14:53    [421047]     Ответить | Цитировать Сообщить модератору
 Re: Последовательность JOIN ... ON  [new]
Павел Воронцов
Member

Откуда: Новосибирск
Сообщений: 2386
Блог
Вот Вам тема для размышления

set nocount on
create table t1 (id int not null primary key)
create table t2 (id2 int not null identity(1,1) primary key,
id int not null foreign key references t1,
name varchar(10) not null,
value int not null)
create table t3 (id3 int not null identity(1,1) primary key,
id int not null foreign key references t2,
description varchar(10) not null)

insert into t1 values (1)
insert into t1 values (2)
insert into t1 values (3)
insert into t1 values (4)
insert into t2 values (1, 'a', 100)
insert into t2 values (1, 'aa', 110)
insert into t2 values (2, 'b', 300)
insert into t2 values (3, 'c', 500)
insert into t3 values (1, 'aq')
insert into t3 values (1, 'aq2')
insert into t3 values (1, 'aq3')
insert into t3 values (2, 'bq')

select t1.id, t2.name, t3.description
from t1 LEFT JOIN t2
ON t1.id = t2.id
left join t3 on
t2.id = t3.id and t2.value > 100


select t1.id, t2.name, t3.description
from t1 LEFT JOIN t2
left join t3
ON t2.id = t3.id and t2.value > 100
ON t1.id = t2.id

select t1.id, t2.name, t3.description
from t1 LEFT JOIN t2
ON t1.id = t2.id and t2.value > 100
left join t3 on
t2.id = t3.id


select t1.id, t2.name, t3.description
from t1 LEFT JOIN t2
left join t3
ON t2.id = t3.id
ON t1.id = t2.id and t2.value > 100

select t1.id, t2.name, t3.description
from t1 LEFT JOIN t2
ON t1.id = t2.id
left join t3 on
t2.id = t3.id
where t2.value > 100


select t1.id, t2.name, t3.description
from t1 LEFT JOIN t2
left join t3
ON t2.id = t3.id
ON t1.id = t2.id
where t2.value > 100

drop table t3
drop table t2
drop table t1
17 ноя 03, 14:56    [421062]     Ответить | Цитировать Сообщить модератору
 Re: Последовательность JOIN ... ON  [new]
Павел Воронцов
Member

Откуда: Новосибирск
Сообщений: 2386
Блог
To DenisA
Ну вот тут собака и порылась.. В условии ON. Вы нам теперь сами расскажите почему так получается или Вам разъяснить? Если Вы ещё не увидели, то мы со всем нашим удовольствием..
17 ноя 03, 14:59    [421066]     Ответить | Цитировать Сообщить модератору
 Re: Последовательность JOIN ... ON  [new]
Павел Воронцов
Member

Откуда: Новосибирск
Сообщений: 2386
Блог
Кстати на запрос
select t1.ID, t2.name, t3.description 

from t1 LEFT JOIN t2
left join t3
ON t1.ID = t2.ID and t2.activity = 1
ON t2.ID = t3.ID
WHERE t2.value >100

сервер мне вполне резонно ругается. А Вам - нет?
17 ноя 03, 15:00    [421073]     Ответить | Цитировать Сообщить модератору
 Re: Последовательность JOIN ... ON  [new]
DenisA
Member

Откуда:
Сообщений: 154
Так в чем проблема?
17 ноя 03, 15:04    [421085]     Ответить | Цитировать Сообщить модератору
 Re: Последовательность JOIN ... ON  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
Ерунда тогда какая-то получается... по идее, второй запрос вообще выполняться не должен бы... Может, все-таки так должно быть:
ON t2.ID = t3.ID 

ON t1.ID = t2.ID
17 ноя 03, 15:09    [421101]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить