Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Join (Inner,Right) вопрос / 10 сообщений из 10, страница 1 из 1
21.10.2002, 08:18:26
    #32060066
svz58
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Join (Inner,Right) вопрос
Уважаемые коллеги помочь разобраться в мех-х Join.

Вопрос в следующем.
При Inner ставлю доп.условие в Join (b_del=0)
Запрос вытаскивает то что надо.
Select a.i_tab as ai_tab, a.b_del,a.n_inn,
d_datv,b.d_datbeg,b.d_datend
From tp_pers a inner Join th_pers_rabota b ON a.i_tab = b.i_tab and b.b_del=0
where b.d_datv between '20020701' and '20021101'

При Right Outer ставлю доп.условие в Join (b_del=0)
Запрос вытаскивает и b_del<>0

Select a.i_tab as ai_tab, a.b_del,a.n_inn,
d_datv,b.d_datbeg,b.d_datend
From tp_pers a Right Outer Join th_pers_rabota b ON a.i_tab = b.i_tab and b.b_del=0
where b.d_datv between '20020701' and '20021101'

Переношу b_del = 0 в Where все нормально.


Не нравится то что при одном объединении работает при другом нет, все в Where тащить неохота или
чтобы все железно работало условия должны быть только в Where
...
Рейтинг: 0 / 0
21.10.2002, 10:21:14
    #32060093
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Join (Inner,Right) вопрос
Ну а что же вы ожидали если
"The SQL-92 right outer join operator, RIGHT OUTER JOIN, indicates all rows in the second table are to be included in the results, regardless of whether there is matching data in the first table ."

Ну а условия в Where проверяются уже после Join-а.
Так что логика тут "железная".
...
Рейтинг: 0 / 0
21.10.2002, 10:21:49
    #32060094
Bzzzzz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Join (Inner,Right) вопрос
Join - объединение, inner - строгое соответствие, right/left - ВЕСЬ набор справа/слева, противоположные наборы ВНЕ СООТВЕТСТВИЯ заполняются NULL. Все это есть в BOL. Приведенный пример работает АБСОЛЮТНО ПРАВИЛЬНО. Результат НЕСТРОГОЙ выборки можно отфильтровать только по WHERE...
...
Рейтинг: 0 / 0
21.10.2002, 11:42:57
    #32060157
sizih_viktor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Join (Inner,Right) вопрос
GLORY
-------
Данный запрос выбирает верную информацию (проверено)
а ведь в JOIN условий хватает.
--------------------------------------------------------
Select
a.i_tab,a.b_del,
i.c_fio,i.c_fioini,
b.d_datv,b.d_datbeg,b.d_datend,b.i_uslpr,b.i_vidrab,b.i_pruvol,b.i_prikaz,
c.d_datv as cd_datv,c.i_pred,c.i_ceh,c.i_podr,
d.d_datv as dd_datv,d.i_dolg,d.i_shtat,d.n_razryad,d.i_razryad,
e.i_kattab,
f.n_tarif,f.i_katopl,
j.c_ceh,
k.c_podr,
l.c_dolg,l.c_dolgk
From
tp_pers a
Inner Join th_pers_rabota b ON a.i_tab = b.i_tab and b.b_del=0
and b.d_datv In (Select Max(d_datv) From th_pers_rabota
Where a.i_tab = th_pers_rabota.i_tab and d_datv <= '20010918' and b_del=0 and i_pruvol=0)
and b.i_tab not In (Select i_tab From th_pers_rabota
Where a.i_tab = th_pers_rabota.i_tab and d_datv <= '20010918' and b_del=0 and i_pruvol<>0)
Left Outer Join th_pers_podr c ON a.i_tab = c.i_tab and c.b_del=0
and c.d_datv In (Select Max(d_datv) From th_pers_podr
Where a.i_tab = th_pers_podr.i_tab and d_datv <= '20010918' and b_del=0 )
Left Outer Join th_pers_dolg d ON a.i_tab = d.i_tab and d.b_del=0
and d.d_datv In (Select Max(d_datv) From th_pers_dolg
Where a.i_tab = th_pers_dolg.i_tab and d_datv <= '20010918' and b_del=0 )
Left Outer Join th_pers_kattab e ON a.i_tab = e.i_tab and e.b_del=0
and e.d_datv In (Select Max(d_datv) From th_pers_kattab
Where a.i_tab = th_pers_kattab.i_tab and d_datv <= '20010918' and b_del=0 )
Left Outer Join th_pers_tarif f ON a.i_tab = f.i_tab and f.b_del=0
and f.d_datv In (Select Max(d_datv) From th_pers_tarif
Where a.i_tab = th_pers_tarif.i_tab and d_datv <= '20010918' and b_del=0 )
Left Outer Join th_pers_fio i ON a.i_tab = i.i_tab and i.b_del=0
and i.d_datv In (Select Max(d_datv) From th_pers_fio
Where a.i_tab = th_pers_fio.i_tab)
Left Outer Join ts_ceh j on c.i_ceh = j.i_ceh
and c.i_pred = j.i_pred
Left Outer Join ts_podr k on c.i_ceh = k.i_ceh
and c.i_podr = k.i_podr and c.i_pred = k.i_pred
Left Outer Join ts_dolg l on d.i_dolg = l.i_dolg
или думаете частный случай,
все равно работать только с WHERE
...
Рейтинг: 0 / 0
21.10.2002, 11:53:15
    #32060165
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Join (Inner,Right) вопрос
Во-первых, непонятно про какой конкретно Join и какое условие в вашем примере вы говорите.
Во-вторых, в вашем примере я вижу только Left Join.
В-третьих, проверить что-же действительно выдает ваш запрос я не могу.
...
Рейтинг: 0 / 0
21.10.2002, 12:51:26
    #32060197
Garya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Join (Inner,Right) вопрос
Glory, не left, а right.

2svz58. Я когда-то тоже пытался в Join целиком все условие запихнуть, но у меня тоже корректно не работало. Потом понял, что join-у join-ово, а where-у where-ово. Join используется для задания условий объединения и подразумевает участие слева и справа от знака сравнения полей объединяемых таблиц, а не бог весть чего. Какая у вас необходиомсть именно в join затолкать условие выборки? Чем не устраивает условие where?
...
Рейтинг: 0 / 0
21.10.2002, 13:29:39
    #32060220
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Join (Inner,Right) вопрос
2Garya
Не понял - что "не left, а right"
...
Рейтинг: 0 / 0
21.10.2002, 14:02:25
    #32060238
Garya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Join (Inner,Right) вопрос
2 Glory.
> Во-вторых, в вашем примере я вижу только Left Join.

Select a.i_tab as ai_tab, a.b_del,a.n_inn,
d_datv,b.d_datbeg,b.d_datend
From tp_pers a Right Outer Join th_pers_rabota b ON a.i_tab = b.i_tab and b.b_del=0
where b.d_datv between '20020701' and '20021101'
...
Рейтинг: 0 / 0
21.10.2002, 14:27:27
    #32060249
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Join (Inner,Right) вопрос
Я речь уже вел про запрос в сообщении от sizih_viktor.
...
Рейтинг: 0 / 0
22.10.2002, 03:25:12
    #32060507
sizih_viktor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Join (Inner,Right) вопрос
Garya & Glory!!

Спасибо за ответы.

К сожалению вынужден с Вами согласиться,

просто мне казалось, что "так красивше" если это
слово можно использовать для T-SQL
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Join (Inner,Right) вопрос / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]