powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Join (Inner,Right) вопрос
10 сообщений из 10, страница 1 из 1
Join (Inner,Right) вопрос
    #32060066
svz58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемые коллеги помочь разобраться в мех-х 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
Join (Inner,Right) вопрос
    #32060093
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну а что же вы ожидали если
"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
Join (Inner,Right) вопрос
    #32060094
Bzzzzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Join - объединение, inner - строгое соответствие, right/left - ВЕСЬ набор справа/слева, противоположные наборы ВНЕ СООТВЕТСТВИЯ заполняются NULL. Все это есть в BOL. Приведенный пример работает АБСОЛЮТНО ПРАВИЛЬНО. Результат НЕСТРОГОЙ выборки можно отфильтровать только по WHERE...
...
Рейтинг: 0 / 0
Join (Inner,Right) вопрос
    #32060157
sizih_viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Join (Inner,Right) вопрос
    #32060165
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-первых, непонятно про какой конкретно Join и какое условие в вашем примере вы говорите.
Во-вторых, в вашем примере я вижу только Left Join.
В-третьих, проверить что-же действительно выдает ваш запрос я не могу.
...
Рейтинг: 0 / 0
Join (Inner,Right) вопрос
    #32060197
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Glory, не left, а right.

2svz58. Я когда-то тоже пытался в Join целиком все условие запихнуть, но у меня тоже корректно не работало. Потом понял, что join-у join-ово, а where-у where-ово. Join используется для задания условий объединения и подразумевает участие слева и справа от знака сравнения полей объединяемых таблиц, а не бог весть чего. Какая у вас необходиомсть именно в join затолкать условие выборки? Чем не устраивает условие where?
...
Рейтинг: 0 / 0
Join (Inner,Right) вопрос
    #32060220
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Garya
Не понял - что "не left, а right"
...
Рейтинг: 0 / 0
Join (Inner,Right) вопрос
    #32060238
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Join (Inner,Right) вопрос
    #32060249
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я речь уже вел про запрос в сообщении от sizih_viktor.
...
Рейтинг: 0 / 0
Join (Inner,Right) вопрос
    #32060507
sizih_viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Garya & Glory!!

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

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

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


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