|
|
|
Join (Inner,Right) вопрос
|
|||
|---|---|---|---|
|
#18+
Уважаемые коллеги помочь разобраться в мех-х 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2002, 08:18:26 |
|
||
|
Join (Inner,Right) вопрос
|
|||
|---|---|---|---|
|
#18+
Ну а что же вы ожидали если "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-а. Так что логика тут "железная". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2002, 10:21:14 |
|
||
|
Join (Inner,Right) вопрос
|
|||
|---|---|---|---|
|
#18+
Join - объединение, inner - строгое соответствие, right/left - ВЕСЬ набор справа/слева, противоположные наборы ВНЕ СООТВЕТСТВИЯ заполняются NULL. Все это есть в BOL. Приведенный пример работает АБСОЛЮТНО ПРАВИЛЬНО. Результат НЕСТРОГОЙ выборки можно отфильтровать только по WHERE... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2002, 10:21:49 |
|
||
|
Join (Inner,Right) вопрос
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2002, 11:42:57 |
|
||
|
Join (Inner,Right) вопрос
|
|||
|---|---|---|---|
|
#18+
Во-первых, непонятно про какой конкретно Join и какое условие в вашем примере вы говорите. Во-вторых, в вашем примере я вижу только Left Join. В-третьих, проверить что-же действительно выдает ваш запрос я не могу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2002, 11:53:15 |
|
||
|
Join (Inner,Right) вопрос
|
|||
|---|---|---|---|
|
#18+
Glory, не left, а right. 2svz58. Я когда-то тоже пытался в Join целиком все условие запихнуть, но у меня тоже корректно не работало. Потом понял, что join-у join-ово, а where-у where-ово. Join используется для задания условий объединения и подразумевает участие слева и справа от знака сравнения полей объединяемых таблиц, а не бог весть чего. Какая у вас необходиомсть именно в join затолкать условие выборки? Чем не устраивает условие where? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2002, 12:51:26 |
|
||
|
Join (Inner,Right) вопрос
|
|||
|---|---|---|---|
|
#18+
2Garya Не понял - что "не left, а right" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2002, 13:29:39 |
|
||
|
Join (Inner,Right) вопрос
|
|||
|---|---|---|---|
|
#18+
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' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2002, 14:02:25 |
|
||
|
Join (Inner,Right) вопрос
|
|||
|---|---|---|---|
|
#18+
Я речь уже вел про запрос в сообщении от sizih_viktor. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2002, 14:27:27 |
|
||
|
|

start [/forum/topic.php?fid=46&fpage=3393&tid=1819434]: |
0ms |
get settings: |
7ms |
get forum list: |
9ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
17ms |
get topic data: |
7ms |
get forum data: |
1ms |
get page messages: |
71ms |
get tp. blocked users: |
1ms |
| others: | 184ms |
| total: | 303ms |

| 0 / 0 |
