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

Откуда: Ростов-на-Дону
Сообщений: 623
Есть выборка из трёх таблиц.
Скажем, A, B, C

select
.....
from A
cross join B
left join C
on A.a1 = C.a1 and B.b1 = C.b1

На самом деле делает inner join вместо left join на продукте crossjoin A B - из него пропадают элементы. Я, конечно, это обойду, но может, кто-нибудь знает, по какой логике это так работает.
22 дек 04, 09:09    [1198641]     Ответить | Цитировать Сообщить модератору
 Re: Почему так работает?  [new]
Alois
Member

Откуда:
Сообщений: 354
Не надо ничего обходить. Можно представить сюда Ваш точный запрос?
22 дек 04, 09:12    [1198645]     Ответить | Цитировать Сообщить модератору
 Re: Почему так работает?  [new]
Secret
Member

Откуда: Moscow
Сообщений: 72
посмотрите план выполнения, выбранный оптимизатором; он может быть не таким как вы ожидали
22 дек 04, 09:36    [1198707]     Ответить | Цитировать Сообщить модератору
 Re: Почему так работает?  [new]
Va1entin
Member [заблокирован]

Откуда: Ростов-на-Дону
Сообщений: 623
Alois
Можно представить сюда Ваш точный запрос?

некоторые названия изменены
select
	di.DateIzm,
	v.SN,
	v.SLO, 
	v.SPr, 
	v.SP, 
	v.DateP, 
	v.DatePr, 
	v.KGO, 
	v.KGP, 
	v.KG, 
	v.R1,
	Pr1 = case
		when (sn.KD = slo.KD) and (DateAdd(Hour, 1, v.DateLastOper) >= di.DateIzm) and (sn.KD <> spo.KD) then 1
		else 0
	end,
	Pr2 = case
		when (sn.KD = slo.KD) and (sn.KN = slo.KN) and (DateAdd(Hour, 1, v.DateLastOper) >= di.DateIzm) and ((sn.KD <> spo.KD) or (sn.KN <> spo.KN)) then 1
		else 0
	end,
	Pr3 = case
		when (sn.KD = slo.KD) and (sn.KC = slo.KC) and (DateAdd(Hour, 1, v.DateLastOper) >= di.DateIzm) and ((sn.KD <> spo.KD) or (sn.KC <> spo.KC)) then 1
		else 0
	end,
	Pr4 = case
		when (v.SN = v.SLO) and (DateAdd(Hour, 1, v.DateLastOper) >= di.DateIzm) and (v.SN <> isnull(rcv.SLO, 0)) then 1
		else 0
	end,
	Pr5 = case
		when sn.KD = slo.KD then 1
		else 0
	end,
	Pr6 = case
		when (sn.KD = slo.KD) and (sn.KN = slo.KN) then 1
		else 0
	end,
	Pr7 = case
		when (sn.KD = slo.KD) and (sn.KC = slo.KC) then 1
		else 0
	end,
	Pr8 = case
		when v.SN = v.SLO then 1
		else 0
	end
into #RCV1
from #v1 v
cross join #DatesIzm di
inner join OS1 sn 
	on sn.K1 = v.SN
inner join OS1 slo 
	on slo.K1 = v.SLO
left join RCV1 rcv
	on DateAdd(Hour, -1, di.DateIzm) = rcv.DateIzm
	and v.NV = rcv.NV
inner join OS1 spo 
	on spo.K1 = rcv.SLO
where v.DateLastOper <= di.DateIzm

Из продукта
#v1 v
cross join #DatesIzm di

пропадают результаты, которых нет в rcv,
т.е. выполняется inner join?

Мне интересно почему так работает MSSQL обходное решение найду сам.
22 дек 04, 09:39    [1198722]     Ответить | Цитировать Сообщить модератору
 Re: Почему так работает?  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
а вы уверены, что без лефт джоина эти данные присутствуют?


для спящего время бодрствования равносильно сну
22 дек 04, 09:44    [1198743]     Ответить | Цитировать Сообщить модератору
 Re: Почему так работает?  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
P.S. можно обойтись и без cross join, а просто join...
и в on указать
v.DateLastOper <= di.DateIzm

для спящего время бодрствования равносильно сну
22 дек 04, 09:45    [1198752]     Ответить | Цитировать Сообщить модератору
 Re: Почему так работает?  [new]
Smirnov Anton
Member

Откуда: Н.Новгород
Сообщений: 3220
Алексей2003
а вы уверены, что без лефт джоина эти данные присутствуют?


для спящего время бодрствования равносильно сну

,да у вас же там ещё куча иннер джойнов, может они обрезают?
22 дек 04, 09:47    [1198763]     Ответить | Цитировать Сообщить модератору
 Re: Почему так работает?  [new]
Va1entin
Member [заблокирован]

Откуда: Ростов-на-Дону
Сообщений: 623
Спасибо, уже нашёл.
Дело портил inner join по rcv. Inner join'ы по v влияют только на продукт cross join, они даже необходимы как воздух именно как innerjoin'ы
Алексей2003
,да у вас же там ещё куча иннер джойнов, может они обрезают?

Так и было.
А вчера часа три бессмысленно потратил :-(
Всем спасибо.
22 дек 04, 10:05    [1198854]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить