Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
LEFT JOIN с дополнительными условиями
|
|||
|---|---|---|---|
|
#18+
Есть такой запрос: 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' Он выдает только те имена, которые встречаются в обоих базах. Как же должен правильно выглядеть второй запрос, чтобы результаты были одинаковые ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2001, 15:03 |
|
||
|
LEFT JOIN с дополнительными условиями
|
|||
|---|---|---|---|
|
#18+
Любопытно, что требуемый результат получается в рез-те следующего запроса: 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' Иначе фильтры расставляются не там, где надо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2001, 20:49 |
|
||
|
LEFT JOIN с дополнительными условиями
|
|||
|---|---|---|---|
|
#18+
2 GreenSunrise Ответ на ваш вопрос в BOL смотрите "Specifying Joins in FROM or WHERE Clauses" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2001, 05:05 |
|
||
|
LEFT JOIN с дополнительными условиями
|
|||
|---|---|---|---|
|
#18+
Всем спасибо. Действительно такая расстановка условий - одно в where, другое в from работает... Только мне все равно до конца не понятно, почему нужно писать именно так. И прочтение статьи в BOL не особо помогло. Там рассматривается простейший пример, когда добавляется только одно условие, они его бодро запихивают в from к join'у - и привет. А если у меня не одно, и не два условия ? По какому принципу их надо растаскивать ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2001, 06:27 |
|
||
|
LEFT JOIN с дополнительными условиями
|
|||
|---|---|---|---|
|
#18+
>А если у меня не одно, и не два условия ? По какому принципу их надо растаскивать ? Условия чего? Если соединения тогда запихиваете эти условия во from, ключевые слова and и or, я полагаю вам знакомы , а если условия фильтра, то тогда в where. Что тут сложного то? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2001, 06:32 |
|
||
|
LEFT JOIN с дополнительными условиями
|
|||
|---|---|---|---|
|
#18+
Ну вот из моего примера - два дополнительных условия: so1.type = 'U' и so2.type = 'U'. Для меня они равнозначны. Но для корректной работы select'а пришлось второе переносить в from, а первое оставить в where. Почему ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2001, 08:56 |
|
||
|
LEFT JOIN с дополнительными условиями
|
|||
|---|---|---|---|
|
#18+
>Но для корректной работы select'а пришлось второе переносить в from, а первое оставить в where. Не понял, что so1.type = 'U' and so2.type = 'U' оставить в where то запрос выдает неверный набор? Странно, как то, дайте что ль примеры возвращаемых записей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2001, 10:26 |
|
||
|
LEFT JOIN с дополнительными условиями
|
|||
|---|---|---|---|
|
#18+
Вот именно! Два select'а из моего вопроса (первое сообщение), возвращают разные результаты. Пусть в БД sql6 есть пользовательские таблицы t1, t2. В БД sql7 таблицы t1, t3 Первый select возвращает t1, t1 t2, null Второй select возвращает t1, t1 Вот. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2001, 11:03 |
|
||
|
LEFT JOIN с дополнительными условиями
|
|||
|---|---|---|---|
|
#18+
2 GreenSunrise Какой то странный у нас разговор получается.... как будто и об одно и том же говорим Первый select возвращает t1, t1 t2, null Второй select возвращает t1, t1 Ну и что тут непонятного? Именно эта ситуация и описана в BOL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2001, 11:14 |
|
||
|
LEFT JOIN с дополнительными условиями
|
|||
|---|---|---|---|
|
#18+
При выполнении внешнего объединения 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 никогда не будет истинным, и данные строки в результат не попадут. Надеюсь, был доходчив ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2001, 11:35 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32009904&tid=1826136]: |
0ms |
get settings: |
4ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
27ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
32ms |
get tp. blocked users: |
1ms |
| others: | 210ms |
| total: | 296ms |

| 0 / 0 |
