powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Киньте в меня примером разночитаемого запроса с OUTER JOIN по сравнению с *=
18 сообщений из 18, страница 1 из 1
Киньте в меня примером разночитаемого запроса с OUTER JOIN по сравнению с *=
    #32049174
Фотография Gobzo Kobler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я помню, что в один момент *= стала выдавать разные результаты по сравнению с LEFT и RIGHT JOIN. Но не могу найти никаких конкретных запросов, где бы это иллюстрировалось. На нынешней работе "корпоративный стандарт" писать условия объединения в WHERE, а я всю жизнь писал их в FROM и теперь не то что трудно переучиваться, а еще и смысла не видно, поскольку сам MS рекомендует JOIN и указывает на неоднозначность *=. Помогите найти компромат на *=!
...
Рейтинг: 0 / 0
Киньте в меня примером разночитаемого запроса с OUTER JOIN по сравнению с *=
    #32049184
Зайцев Фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуйте повторить результат с *=
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
set nocount on
if Object_ID ('tempdb..#t1') >  0  drop table #t1
if Object_ID ('tempdb..#t2') >  0  drop table #t2
create table #t1 (t1_id int, t1_name varchar( 10 ))
create table #t2 (t2_id int, t1_id int, t2_name varchar( 10 ))
insert into #t1 values ( 1 , '1')
insert into #t1 values ( 2 , '1')
insert into #t1 values ( 3 , null)
insert into #t1 values ( 4 , '1')
insert into #t2 values ( 1 ,  1 , 'a')
insert into #t2 values ( 2 ,  1 , null)
insert into #t2 values ( 3 ,  2 , 'c')
insert into #t2 values ( 4 ,  2 , 'd')

select
  t1_t1_id = #t1.t1_id,
  t2_t1_id = #t2.t1_id,
  t1_name = #t1.t1_name,
  t2_name = #t2.t2_name
from #t1 left join #t2 on #t1.t1_id = #t2.t1_id
where #t2.t1_id is null
go


посмотрите, что выдаст
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select q1.*
from (
select
  t1_t1_id = #t1.t1_id,
  t2_t1_id = #t2.t1_id,
  t1_name = #t1.t1_name,
  t2_name = #t2.t2_name
from #t1, #t2
where #t1.t1_id *= #t2.t1_id
) q1
where q1.t2_t1_id is null
...
Рейтинг: 0 / 0
Киньте в меня примером разночитаемого запроса с OUTER JOIN по сравнению с *=
    #32049188
Фотография Gobzo Kobler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, не в бровь, а в глаз!
А откуда это взято? Хорошо бы еще чтобы источник был американским...
...
Рейтинг: 0 / 0
Киньте в меня примером разночитаемого запроса с OUTER JOIN по сравнению с *=
    #32049197
Зайцев Фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из жизДни 8(
...
Рейтинг: 0 / 0
Киньте в меня примером разночитаемого запроса с OUTER JOIN по сравнению с *=
    #32049215
Серг70
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вы пытаетесь сравнивать несравнимые запросы
Вот эти два дают один результат, потому что запрашивают одно и тоже
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
if Object_ID ('tempdb..#t1') >  0  drop table #t1
if Object_ID ('tempdb..#t2') >  0  drop table #t2
create table #t1 (t1_id int, t1_name varchar( 10 ))
create table #t2 (t2_id int, t1_id int, t2_name varchar( 10 ))
insert into #t1 values ( 1 , '1')
insert into #t1 values ( 2 , '1')
insert into #t1 values ( 3 , null)
insert into #t1 values ( 4 , '1')
insert into #t2 values ( 1 ,  1 , 'a')
insert into #t2 values ( 2 ,  1 , null)
insert into #t2 values ( 3 ,  2 , 'c')
insert into #t2 values ( 4 ,  2 , 'd')

Select * From #t1
Select * From #t2
select
  t1_t1_id = #t1.t1_id,
  t1_name = #t1.t1_name,
  t2_t1_id = #t2.t1_id,
  t2_name = #t2.t2_name
from #t1 left join #t2 on #t1.t1_id = #t2.t1_id
and #t2.t1_id is null

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
if Object_ID ('tempdb..#t1') >  0  drop table #t1
if Object_ID ('tempdb..#t2') >  0  drop table #t2
create table #t1 (t1_id int, t1_name varchar( 10 ))
create table #t2 (t2_id int, t1_id int, t2_name varchar( 10 ))
insert into #t1 values ( 1 , '1')
insert into #t1 values ( 2 , '1')
insert into #t1 values ( 3 , null)
insert into #t1 values ( 4 , '1')
insert into #t2 values ( 1 ,  1 , 'a')
insert into #t2 values ( 2 ,  1 , null)
insert into #t2 values ( 3 ,  2 , 'c')
insert into #t2 values ( 4 ,  2 , 'd')

Select * From #t1
Select * From #t2

select
  t1_t1_id = #t1.t1_id,
  t1_name = #t1.t1_name,
  t2_t1_id = #t2.t1_id,
  t2_name = #t2.t2_name
from #t1, #t2
where #t1.t1_id *= #t2.t1_id
and #t2.t1_id is null

Так что тщательнЕе нужно, тщательнЕе ...
...
Рейтинг: 0 / 0
Киньте в меня примером разночитаемого запроса с OUTER JOIN по сравнению с *=
    #32049223
Фотография Gobzo Kobler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня результаты разные, как и должно быть. SQL7. А у тебя какая версия?
...
Рейтинг: 0 / 0
Киньте в меня примером разночитаемого запроса с OUTER JOIN по сравнению с *=
    #32049267
Серг70
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А у меня на последних двух примеров, есно, одинаковые (MS SQL 2000)
...
Рейтинг: 0 / 0
Киньте в меня примером разночитаемого запроса с OUTER JOIN по сравнению с *=
    #32049278
Зайцев Фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Серг70
Повторите, плз, результат 1-го запроса из моего примера.
Используя "*=".
...
Рейтинг: 0 / 0
Киньте в меня примером разночитаемого запроса с OUTER JOIN по сравнению с *=
    #32049289
Серг70
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если в примере 1 использовать конструкцию
Код: plaintext
Where #t2.t1_id is null
, то выносится две строки, т.к. сначала объединяются таблицы, а потом из них выбираются по этому условию, а если использовать в условии объеденения
Код: plaintext
and #t2.t1_id is null
, то выносится, как и положено четыре строки. Так заложено в T_SQL
...
Рейтинг: 0 / 0
Киньте в меня примером разночитаемого запроса с OUTER JOIN по сравнению с *=
    #32049299
Зайцев Фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Серг70
Как по Вашему, 2-й запрос из моего примера выдаёт ожидаемый результат, или нет?
...
Рейтинг: 0 / 0
Киньте в меня примером разночитаемого запроса с OUTER JOIN по сравнению с *=
    #32049305
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тут посмотрел по планировщику, чем собственно отличаются друг от друга 2 запроса:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select q1.*
from (
select
  t1_t1_id = #t1.t1_id,
  t2_t1_id = #t2.t1_id,
  t1_name = #t1.t1_name,
  t2_name = #t2.t2_name
from #t1, #t2
where #t1.t1_id *= #t2.t1_id
) q1
where q1.t2_t1_id is null


и классический

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
select q1.*
from (
select
  t1_t1_id = #t1.t1_id,
  t2_t1_id = #t2.t1_id,
  t1_name = #t1.t1_name,
  t2_name = #t2.t2_name
from #t1 left join #t2 on #t1.t1_id = #t2.t1_id
) q1
where q1.t2_t1_id is null


Оказалось, что врет именно анализатор запросов SQL. При использовании JOIN условие WHERE накладывается именно на таблицу #t2, а при связи через *= почему-то наложилось ограничение на #t1 (т.е. на главную таблицу).

Отсюда и расхождение в результатах.

Да, у меня SQLS7SP4
...
Рейтинг: 0 / 0
Киньте в меня примером разночитаемого запроса с OUTER JOIN по сравнению с *=
    #32049314
Зайцев Фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2ВладимирМ
>>Да, у меня SQLS7SP4
Это пофигу.
...
Рейтинг: 0 / 0
Киньте в меня примером разночитаемого запроса с OUTER JOIN по сравнению с *=
    #32049341
Серг70
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да заморочки с *= были еще с 6.5 ,но ведь это не стандарт SQL. Аналогичные заморочки есть и в SyBase, но в SyBase нет Left Join .
Я всегда такие запросы разбивал на два и более, так как при наличии *= нельзя дальше связывать таблицы с правой от *= . Тот самый запрос должен выглядеть так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select
  t1_t1_id = #t1.t1_id,
  t2_t1_id = #t2.t1_id,
  t1_name = #t1.t1_name,
  t2_name = #t2.t2_name
Into #q1
from #t1, #t2
where #t1.t1_id *= #t2.t1_id

select #q1.*
from #q1
where #q1.t2_t1_id is null

Тогда все правильно, как с Left Join .
Кстати, в FoxPro просто нет конструкции *= , и поэтому там таких заморочек нет.
...
Рейтинг: 0 / 0
Киньте в меня примером разночитаемого запроса с OUTER JOIN по сравнению с *=
    #32049410
Фотография Gobzo Kobler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoxPro еще и не база данных :)
...
Рейтинг: 0 / 0
Киньте в меня примером разночитаемого запроса с OUTER JOIN по сравнению с *=
    #32049411
Зайцев Фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так, блин.
...
Рейтинг: 0 / 0
Киньте в меня примером разночитаемого запроса с OUTER JOIN по сравнению с *=
    #32049430
Серг70
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Gobzo Kolber
Не трогай любимое дитя.
FoxPro очень хороша для небольших баз. Хотя что такое небольшая. Сейчас эксплуатируем БД с 400 ХП и 100 таблицами. В самой большой - 1 000 000 записей. Она почти как большая + в ней есть очень хороший интерфейс, почти как в VB
...
Рейтинг: 0 / 0
Киньте в меня примером разночитаемого запроса с OUTER JOIN по сравнению с *=
    #32049443
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблемы с *= обычно вылезают при связывании трех и более таблиц. Сейчас примера нет, но есть другой, о невозможности сделать через *=, то что можно сделать через OUTER JOIN

Для 7.0

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
create table t1 (id int)
create table t2 (id int)
create table t3 (id int)
 -- заполнять необязательно, запросы чисто на синтаксис
 
select t3.id,t2.id,t1.id from  t1
left outer join t2 on t1.id=t2.id
left outer join t3 on t2.id=t3.id
go
 /* этот запрос невозможен */ 
select t3.id,t2.id,t1.id from t1, t2, t3
where t1.id *= t2.id
and t2.id *= t3.id
go
drop table t1
drop table t2
drop table t3
...
Рейтинг: 0 / 0
Киньте в меня примером разночитаемого запроса с OUTER JOIN по сравнению с *=
    #32049532
Фотография Gobzo Kobler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2:
И за это спасибо.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Киньте в меня примером разночитаемого запроса с OUTER JOIN по сравнению с *=
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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