Вот смотрите. Есть у меня две почти одинаковые таблички, в каждой по 5 записей, ключ в каждой - 4 первые колонки.
Я пишу:
select *
from T1 full outer join T2 on список полей со знаками равенства
Запрос выводит мне все 5 записей, все поля не null. Отлично, говорю себе я, меняю full outer join на inner join, надеясь получить всё те же 5 записей... И получаю фигу с маслом - пустой запрос.
Ради интереса попробовал left outer join и right outer join - выводят всё те же 5 строчек.
На всякий случай: поля все называются по-разному, так что не может быть, что одно поле как-то перекрывается тёзкой из другой таблицы.
Ну и (я думаю, тут собака и зарыта) это SAS... А у него, как известно, собственные понятия, как должен работать SQL.
Я пишу:
select *
from T1 full outer join T2 on список полей со знаками равенства
Запрос выводит мне все 5 записей, все поля не null. Отлично, говорю себе я, меняю full outer join на inner join, надеясь получить всё те же 5 записей... И получаю фигу с маслом - пустой запрос.
Ради интереса попробовал left outer join и right outer join - выводят всё те же 5 строчек.
На всякий случай: поля все называются по-разному, так что не может быть, что одно поле как-то перекрывается тёзкой из другой таблицы.
Ну и (я думаю, тут собака и зарыта) это SAS... А у него, как известно, собственные понятия, как должен работать SQL.
no subject
Date: 2008-11-17 04:01 pm (UTC)no subject
Date: 2008-11-17 04:25 pm (UTC)А тут он мне выводит красивую табличку типа:
(первые 4 колонки - ключ первой таблицы, вторые - второй). Если бы была просто проблема разницы inner с outer было бы что-то типа:
(точки означают null).
Пример у меня не получается сделать. Если я ручками набиваю таблицу, то всё работает прекрасно. Поскольку это SAS, я даже не могу сгенерить скрипт, создающий базу... Так что только теоретизировать приходится.
no subject
Date: 2008-11-17 04:27 pm (UTC)no subject
Date: 2008-11-24 04:57 am (UTC)вродь декартовым произведением множеств величали (эх, скок лет приличных запросов ужо не писал)
no subject
Date: 2008-11-24 08:30 am (UTC)А по поводу "приличных" - у меня же говно полное. Есть две таблицы, надо проверить, что они "одинаковые".
Т.е. я первым делом проверяю, что все записи есть и слева, и справа - тупой full outer join по полям ключа, с where ключ справа или ключ слева is null.
А вторым делом я проверяю поле за полем: inner join по ключу, вывожу ключ и поле слева, поле справа, where поле слева не равно полю справа. Маленький макрос пробегает по всем полям таблицы и запускает этот запрос.
Быстродействие не нужно, так что об оптимизации поговорим потом :-)
И вот тут я вижу, что full outer join bp gthdjuj pfghjcf "находит" все записи (я специально отключаю where, чтобы убедиться), а inner join из второго не находит ничего! Это же бред, нет разве? Безприменительно к конкретным данным, такого же не бывает?
no subject
Date: 2008-12-01 07:01 am (UTC)> Есть две таблицы, надо проверить, что они "одинаковые".
похоже на natural join, но если бывают null, не годиц, приходится иметься как ты описывал.
>full outer join bp gthdjuj pfghjcf "находит" все записи
ну да, и по хорошему именно в виде как ты писал (с наллами в пустых строках а не повторялки данных)
>а inner join из второго не находит ничего!
если взять твоему пример сверху, то первая строчка полностью та же т.е. не покажется в резалте, а остальные - по природе иннер джона не проходят..
я б все таки поигрался с базой, но так времени нет и нет, все какая то фигня под ногами болтается %)
no subject
Date: 2008-11-24 04:59 am (UTC)