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

Откуда:
Сообщений: 255
create table #ta (a1 int)
create table #tb (b1 int)
create table #tc (c1 int, cd1 int)
create table #td (d1 int)

insert into #ta values (1)
insert into #tb values (1)
insert into #tc values (1, 1)
insert into #td values (1)

теперь несколько, запросов которые на первый взгляд ни чем не отличаются, но дают разные результаты:
select *
from #ta
	inner join #tc on c1 = a1
	left  join #tb on b1 = a1
	inner join #td on d1 = cd1
where b1 is null
a1 b1 c1 cd1d1


select *
from #ta
	left  join #tb on b1 = a1
	inner join #tc on c1 = a1
	inner join #td on d1 = cd1
where a1 = 1 and b1 is null
a1 b1 c1 cd1d1
11111


select *
from #ta
	inner join #tc on c1 = a1
	left  join #tb on b1 = a1
	inner join #td on d1 = cd1
where a1 = 1 and b1 is null
a1 b1 c1 cd1d1


select *
from #ta
	left  join #tb on b1 = a1
	left  join #tc on c1 = a1
	left  join #td on d1 = cd1
where a1 = 1 and b1 is null
a1 b1 c1 cd1d1


select *
from #ta
	left  join #tb on b1 = a1
	inner join #tc on c1 = a1 and b1 is null
	inner join #td on d1 = cd1 and b1 is null
where a1 = 1 and b1 is null
a1 b1 c1 cd1d1
11111

Может кто объяснить подобное поведение?

select @@version
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Microsoft SQL Server 2000 - 8.00.2039 (Intel X86)
May 3 2005 23:18:38
Copyright (c) 1988-2003 Microsoft Corporation
Developer Edition on Windows NT 6.1 (Build 7601: Service Pack 1)
27 ноя 12, 19:29    [13539063]     Ответить | Цитировать Сообщить модератору
 Re: Непонятно поведение left join  [new]
Astakhov
Member

Откуда:
Сообщений: 255
Кстати, на SQL 2008 - бага не проявляется.
27 ноя 12, 19:43    [13539110]     Ответить | Цитировать Сообщить модератору
 Re: Непонятно поведение left join  [new]
aleks2
Guest
Microsoft SQL Server 2000 - 8.00.2305 (Intel X86) May 14 2012 16:24:50 Copyright (c) 1988-2003 Microsoft Corporation Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)

ничо загадочного не наблюдается.
27 ноя 12, 19:49    [13539143]     Ответить | Цитировать Сообщить модератору
 Re: Непонятно поведение left join  [new]
Astakhov
Member

Откуда:
Сообщений: 255
aleks2,
проверил на другом сервере
Microsoft SQL Server 2000 - 8.00.2039 (Intel X86) May 3 2005 23:18:38 Copyright (c) 1988-2003 Microsoft Corporation Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)

Аналогичная беда.
27 ноя 12, 19:55    [13539167]     Ответить | Цитировать Сообщить модератору
 Re: Непонятно поведение left join  [new]
Glory
Member

Откуда:
Сообщений: 104751
Завист от порядка джойнов
select *
from #ta
	left  join #tb on b1 = a1
	inner join #tc on c1 = a1
	inner join #td on d1 = cd1
where a1 = 1 and b1 is null

select *
from #ta
	inner join #tc on c1 = a1
	inner join #td on d1 = cd1
	left  join #tb on b1 = a1
where a1 = 1 and b1 is null

тереяется фильтр b1 is null в плане
на 2066 тоже воспроизводится

Скорее всего пофиксен
27 ноя 12, 20:01    [13539203]     Ответить | Цитировать Сообщить модератору
 Re: Непонятно поведение left join  [new]
Glory
Member

Откуда:
Сообщений: 104751
или принудительным указанием стратегии соединения
select *
from #ta
	left  loop join #tb on b1 = a1
	inner loop join #tc on c1 = a1
	inner loop join #td on d1 = cd1
where a1 = 1 and b1 is null
27 ноя 12, 20:10    [13539257]     Ответить | Цитировать Сообщить модератору
 Re: Непонятно поведение left join  [new]
ROLpogo
Member

Откуда: Реутов
Сообщений: 219
Скорее всего этот баг был излечен в этом билде:
SQL Server 2000 build 8.00.2171
910392 FIX: You may receive incorrect results when you run a Transact-SQL query in SQL Server 2000.
28 ноя 12, 12:35    [13541835]     Ответить | Цитировать Сообщить модератору
 Re: Непонятно поведение left join  [new]
Astakhov
Member

Откуда:
Сообщений: 255
Действительно, установил обновления, KB983811

select @@version
Microsoft SQL Server 2000 - 8.00.2305 (Intel X86)
May 14 2012 16:24:50
Copyright (c) 1988-2003 Microsoft Corporation Enterprise Edition on
Windows NT 5.2 (Build 3790: Service Pack 2)

Полегчало. Спасибо.

Одна беда, пока не знаю с чем связано, но на некоторых машинах обновление не устанавливается. Выдает ошибку "Недостаточно памяти для обработки команды".
Как минимум было замечено на всех трех машинах:
1. Win 7 (32/64)
2. Памяти по 8 гб.
3. Дополнительно стоит SQL 2008.
4. Всякие Visual Studio (2003/2008/2010).
5. Не знаю имеет ли значение, MS Office 2010.
select @@version
Microsoft SQL Server 2000 - 8.00.2039 (Intel X86)
May 3 2005 23:18:38
Copyright (c) 1988-2003 Microsoft Corporation Developer Edition on
Windows NT 6.1 (Build 7601: Service Pack 1)
29 ноя 12, 10:35    [13547621]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить