Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 left join заменить на *=  [new]
ninchik
Member

Откуда: Брест, Белоруссия
Сообщений: 27
Добрый день!

Есть вот такая задачка. Умножаются 2 таблицы, левосторонним соединением
таблица customer
id name
1 Иванов
2 Петров
3 Сидоров


таблица info
id number
2 748
3 954


select c.id, c.name, i.number 
from customer с left outer join info i on c.id=i.id

результат:
id name number
1 Иванов null
2 Петров 748
3 Сидоров 954


Абсолютно аналогично первому запросу вот такая вариация записи

select c.id, c.name, i.number 
from customer с,info i
where c.id*=i.id

id name number
1 Иванов null
2 Петров 748
3 Сидоров 954


Согласны?

А теперь мне нужно исключить из выборки те записи, для которых i.number после объединения дает null
Для первого случая:
select c.id, c.name, i.number 
from customer с left outer join info i on c.id=i.id
where i.numer is not null

id name number
2 Петров 748
3 Сидоров 954

А вот для второго случая такая запись нифига неверная, потому что поле i.number в таблице info в момент выборки еще не существовало для данной записи (1 Иванов), оно появилось только после умножения таблиц
select c.id, c.name, i.number 
from customer с,info i
where c.id*=i.id and
i.number is not null

id name number
1 Иванов null
2 Петров 748
3 Сидоров 954


Вот в чем вопрос как в случае, когда left join заменяется на *= исключить null строки?
p.s. ответ: использовать прямое соединение, которое сразу не допустит null строк не принимается, потому что приведенный случай маленький кирпичик большой задачи, но на нем споткнулось много народу :)
6 дек 11, 22:06    [11717289]     Ответить | Цитировать Сообщить модератору
 Re: left join заменить на *=  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
ninchik,

1. *= - это покойник. Нету больше его!
2.
2.1.
select c.id, c.name, i.number 
from customer с join info i on c.id=i.id;
2.2
select c.id, c.name, i.number 
from customer с,info i
where c.id=i.id;
6 дек 11, 22:18    [11717370]     Ответить | Цитировать Сообщить модератору
 Re: left join заменить на *=  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iap
ninchik,

1. *= - это покойник. Нету больше его!
2.
2.1.
select c.id, c.name, i.number 
from customer с join info i on c.id=i.id;
2.2
select c.id, c.name, i.number 
from customer с,info i
where c.id=i.id;
не прочитал p.s. Сумимасен!

Производная таблица почему не подходит?

P.S. Но лучше про *= всё-таки забыть...
6 дек 11, 22:21    [11717399]     Ответить | Цитировать Сообщить модератору
 Re: left join заменить на *=  [new]
ninchik
Member

Откуда: Брест, Белоруссия
Сообщений: 27
iap
P.S. Но лучше про *= всё-таки забыть...


Эх... жаль, потому как придется переписывать мегатонны кода, потому что *= понапихано много где...
6 дек 11, 22:26    [11717423]     Ответить | Цитировать Сообщить модератору
 Re: left join заменить на *=  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
ninchik
iap
P.S. Но лучше про *= всё-таки забыть...


Эх... жаль, потому как придется переписывать мегатонны кода, потому что *= понапихано много где...
Я уж лет пять как переписал
6 дек 11, 22:38    [11717522]     Ответить | Цитировать Сообщить модератору
 Re: left join заменить на *=  [new]
Glory
Member

Откуда:
Сообщений: 104751
ninchik
Вот в чем вопрос как в случае, когда left join заменяется на *= исключить null строки?

Именно потому, что это невозможно сделать в where, и был разработан явный синтаксис соединений, т.е. join
7 дек 11, 00:01    [11717966]     Ответить | Цитировать Сообщить модератору
 Re: left join заменить на *=  [new]
ninchik
Member

Откуда: Брест, Белоруссия
Сообщений: 27
Всем спасибо за внимание! Буду прописывать явно left join
7 дек 11, 10:48    [11719298]     Ответить | Цитировать Сообщить модератору
 Re: left join заменить на *=  [new]
netivan
Member

Откуда:
Сообщений: 8768
ninchik,

первый раз вижу *=, это откуда такой синтаксис??
7 дек 11, 10:56    [11719345]     Ответить | Цитировать Сообщить модератору
 Re: left join заменить на *=  [new]
Klick
Member

Откуда: Стерлитамак - Москва
Сообщений: 1023
netivan
первый раз вижу *=, это откуда такой синтаксис??


С кладбища )
7 дек 11, 11:07    [11719436]     Ответить | Цитировать Сообщить модератору
 Re: left join заменить на *=  [new]
Klick
Member

Откуда: Стерлитамак - Москва
Сообщений: 1023
Олдскульные чуваки до сих так пишут. А в некоторых системах все мегатонны sql кода таким вот весельем полны.
7 дек 11, 11:09    [11719443]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить