Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Киньте в меня примером разночитаемого запроса с OUTER JOIN по сравнению с *= / 18 сообщений из 18, страница 1 из 1
09.09.2002, 17:39:01
    #32049174
Gobzo Kobler
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Киньте в меня примером разночитаемого запроса с OUTER JOIN по сравнению с *=
Я помню, что в один момент *= стала выдавать разные результаты по сравнению с LEFT и RIGHT JOIN. Но не могу найти никаких конкретных запросов, где бы это иллюстрировалось. На нынешней работе "корпоративный стандарт" писать условия объединения в WHERE, а я всю жизнь писал их в FROM и теперь не то что трудно переучиваться, а еще и смысла не видно, поскольку сам MS рекомендует JOIN и указывает на неоднозначность *=. Помогите найти компромат на *=!
...
Рейтинг: 0 / 0
09.09.2002, 17:54:27
    #32049184
Зайцев Фёдор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Киньте в меня примером разночитаемого запроса с OUTER JOIN по сравнению с *=
Попробуйте повторить результат с *=
Код: 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
09.09.2002, 18:04:22
    #32049188
Gobzo Kobler
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Киньте в меня примером разночитаемого запроса с OUTER JOIN по сравнению с *=
Спасибо, не в бровь, а в глаз!
А откуда это взято? Хорошо бы еще чтобы источник был американским...
...
Рейтинг: 0 / 0
09.09.2002, 18:17:23
    #32049197
Зайцев Фёдор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Киньте в меня примером разночитаемого запроса с OUTER JOIN по сравнению с *=
Из жизДни 8(
...
Рейтинг: 0 / 0
09.09.2002, 19:49:14
    #32049215
Серг70
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Киньте в меня примером разночитаемого запроса с OUTER JOIN по сравнению с *=
Вы пытаетесь сравнивать несравнимые запросы
Вот эти два дают один результат, потому что запрашивают одно и тоже
Код: 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
09.09.2002, 21:21:21
    #32049223
Gobzo Kobler
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Киньте в меня примером разночитаемого запроса с OUTER JOIN по сравнению с *=
У меня результаты разные, как и должно быть. SQL7. А у тебя какая версия?
...
Рейтинг: 0 / 0
10.09.2002, 09:42:07
    #32049267
Серг70
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Киньте в меня примером разночитаемого запроса с OUTER JOIN по сравнению с *=
А у меня на последних двух примеров, есно, одинаковые (MS SQL 2000)
...
Рейтинг: 0 / 0
10.09.2002, 10:11:44
    #32049278
Зайцев Фёдор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Киньте в меня примером разночитаемого запроса с OUTER JOIN по сравнению с *=
2Серг70
Повторите, плз, результат 1-го запроса из моего примера.
Используя "*=".
...
Рейтинг: 0 / 0
10.09.2002, 10:25:45
    #32049289
Серг70
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Киньте в меня примером разночитаемого запроса с OUTER JOIN по сравнению с *=
Если в примере 1 использовать конструкцию
Код: plaintext
Where #t2.t1_id is null
, то выносится две строки, т.к. сначала объединяются таблицы, а потом из них выбираются по этому условию, а если использовать в условии объеденения
Код: plaintext
and #t2.t1_id is null
, то выносится, как и положено четыре строки. Так заложено в T_SQL
...
Рейтинг: 0 / 0
10.09.2002, 10:44:44
    #32049299
Зайцев Фёдор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Киньте в меня примером разночитаемого запроса с OUTER JOIN по сравнению с *=
2Серг70
Как по Вашему, 2-й запрос из моего примера выдаёт ожидаемый результат, или нет?
...
Рейтинг: 0 / 0
10.09.2002, 11:11:31
    #32049305
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Киньте в меня примером разночитаемого запроса с OUTER JOIN по сравнению с *=
Я тут посмотрел по планировщику, чем собственно отличаются друг от друга 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
10.09.2002, 11:33:50
    #32049314
Зайцев Фёдор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Киньте в меня примером разночитаемого запроса с OUTER JOIN по сравнению с *=
2ВладимирМ
>>Да, у меня SQLS7SP4
Это пофигу.
...
Рейтинг: 0 / 0
10.09.2002, 12:42:52
    #32049341
Серг70
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Киньте в меня примером разночитаемого запроса с OUTER JOIN по сравнению с *=
Да заморочки с *= были еще с 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
10.09.2002, 15:41:28
    #32049410
Gobzo Kobler
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Киньте в меня примером разночитаемого запроса с OUTER JOIN по сравнению с *=
FoxPro еще и не база данных :)
...
Рейтинг: 0 / 0
10.09.2002, 15:45:45
    #32049411
Зайцев Фёдор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Киньте в меня примером разночитаемого запроса с OUTER JOIN по сравнению с *=
Вот так, блин.
...
Рейтинг: 0 / 0
10.09.2002, 16:27:17
    #32049430
Серг70
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Киньте в меня примером разночитаемого запроса с OUTER JOIN по сравнению с *=
2 Gobzo Kolber
Не трогай любимое дитя.
FoxPro очень хороша для небольших баз. Хотя что такое небольшая. Сейчас эксплуатируем БД с 400 ХП и 100 таблицами. В самой большой - 1 000 000 записей. Она почти как большая + в ней есть очень хороший интерфейс, почти как в VB
...
Рейтинг: 0 / 0
10.09.2002, 16:48:20
    #32049443
Cat2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Киньте в меня примером разночитаемого запроса с OUTER JOIN по сравнению с *=
Проблемы с *= обычно вылезают при связывании трех и более таблиц. Сейчас примера нет, но есть другой, о невозможности сделать через *=, то что можно сделать через 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
10.09.2002, 18:51:59
    #32049532
Gobzo Kobler
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Киньте в меня примером разночитаемого запроса с OUTER JOIN по сравнению с *=
Cat2:
И за это спасибо.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Киньте в меня примером разночитаемого запроса с OUTER JOIN по сравнению с *= / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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