powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / LEFT JOIN с дополнительными условиями
11 сообщений из 11, страница 1 из 1
LEFT JOIN с дополнительными условиями
    #32009867
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть такой запрос:
select
so1.name,
so2.name
from
sql6..sysobjects so1
, sql7..sysobjects so2
where
so1.type = 'U'
and so2.type = 'U'
and so1.name *= so2.name

Он возвращает имена всех пользовательских таблиц из базы sql6 и те таблицы из базы sql7, имена которых встречаются в sql6. Обычный левый джойн.
Хочу заменить синтаксис *= на более корректный LEFT OUTER JOIN. Получаю следующий запрос:
select
so1.name,
so2.name
from
sql6..sysobjects so1 left outer join
sql7..sysobjects so2 on so1.name = so2.name
where
so1.type = 'U'
and so2.type = 'U'

Он выдает только те имена, которые встречаются в обоих базах. Как же должен правильно выглядеть второй запрос, чтобы результаты были одинаковые ?
...
Рейтинг: 0 / 0
LEFT JOIN с дополнительными условиями
    #32009881
Fompro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Любопытно, что требуемый результат получается в рез-те следующего запроса:
select
so1.name,
so2.name
from
pubs..sysobjects so1 left outer join
payorder..sysobjects so2 on so1.name = so2.name
AND so2.type = 'U' WHERE so1.type = 'U'
Иначе фильтры расставляются не там, где надо
...
Рейтинг: 0 / 0
LEFT JOIN с дополнительными условиями
    #32009889
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 GreenSunrise

Ответ на ваш вопрос в BOL смотрите "Specifying Joins in FROM or WHERE Clauses"
...
Рейтинг: 0 / 0
LEFT JOIN с дополнительными условиями
    #32009902
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо. Действительно такая расстановка условий - одно в where, другое в from работает... Только мне все равно до конца не понятно, почему нужно писать именно так. И прочтение статьи в BOL не особо помогло. Там рассматривается простейший пример, когда добавляется только одно условие, они его бодро запихивают в from к join'у - и привет. А если у меня не одно, и не два условия ? По какому принципу их надо растаскивать ?
...
Рейтинг: 0 / 0
LEFT JOIN с дополнительными условиями
    #32009904
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>А если у меня не одно, и не два условия ? По какому принципу их надо растаскивать ?

Условия чего? Если соединения тогда запихиваете эти условия во from, ключевые слова and и or, я полагаю вам знакомы , а если условия фильтра, то тогда в where. Что тут сложного то?
...
Рейтинг: 0 / 0
LEFT JOIN с дополнительными условиями
    #32009920
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот из моего примера - два дополнительных условия: so1.type = 'U' и so2.type = 'U'. Для меня они равнозначны. Но для корректной работы select'а пришлось второе переносить в from, а первое оставить в where.
Почему ?
...
Рейтинг: 0 / 0
LEFT JOIN с дополнительными условиями
    #32009931
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Но для корректной работы select'а пришлось второе переносить в from, а первое оставить в where.

Не понял, что so1.type = 'U' and so2.type = 'U' оставить в where то запрос выдает неверный набор?

Странно, как то, дайте что ль примеры возвращаемых записей.
...
Рейтинг: 0 / 0
LEFT JOIN с дополнительными условиями
    #32009934
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот именно!

Два select'а из моего вопроса (первое сообщение), возвращают разные результаты. Пусть в БД sql6 есть пользовательские таблицы t1, t2. В БД sql7 таблицы t1, t3

Первый select возвращает
t1, t1
t2, null

Второй select возвращает
t1, t1

Вот.
...
Рейтинг: 0 / 0
LEFT JOIN с дополнительными условиями
    #32009935
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 GreenSunrise

Какой то странный у нас разговор получается.... как будто и об одно и том же говорим

Первый select возвращает
t1, t1
t2, null

Второй select возвращает
t1, t1


Ну и что тут непонятного? Именно эта ситуация и описана в BOL.
...
Рейтинг: 0 / 0
LEFT JOIN с дополнительными условиями
    #32009938
ChA+
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
При выполнении внешнего объединения 2 таблиц, условие для внешней таблицы, помещенное в пункт WHERE превращает его в обычный INNER JOIN, так как условия сравнения для соответствующих нулевых строк в этой таблице оценивается в UNKNOWN, и, соответственно, записи в выборку не попадут.
Типичный пример:
"select * from t1 left outer join t2 on (t2.f1 = t1.f1 and t2.f2 = t1.f2) where t1.f1 = 1"
- нормальное внешнее объединение
"select * from t1 left outer join t2 on (t2.f1 = t1.f1 and t2.f2 = t1.f2) where t1.f1 = 1 and t2.f1 = 1"
- внешнее объединение превращается в обычное объединение, из-за того, что для соответствующих
NULL-евых строк в t2 условие в пункте WHERE t2.f1 = 1 никогда не будет истинным, и данные строки в результат не попадут.

Надеюсь, был доходчив
...
Рейтинг: 0 / 0
LEFT JOIN с дополнительными условиями
    #32009947
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага...
Условия, накладываемые на внешнюю таблицу, надо запихивать в join, а условия, накладываемые на внутреннюю, в where.
Теперь вроде прояснилось.
Спасибо!
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / LEFT JOIN с дополнительными условиями
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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