SQL joins

Nov. 17th, 2008 03:26 pm
green_fr: (Default)
[personal profile] green_fr
Вот смотрите. Есть у меня две почти одинаковые таблички, в каждой по 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.

Date: 2008-11-17 04:01 pm (UTC)
From: [identity profile] aguti.livejournal.com
Без примера не разобраться. Но outer join и должен выводить больше записей, чем inner. Хоть он левый, хоть он правый.

Date: 2008-11-17 04:25 pm (UTC)
From: [identity profile] green-fr.livejournal.com
Смотри, как рассуждаю я: outer выводит больше записей, чем inner, если хотя бы в одной из них хотя бы один из ключей null. Правильно?
А тут он мне выводит красивую табличку типа:
11 12 13 14 11 12 13 14
21 22 23 24 21 22 23 24
31 32 33 34 31 32 33 34

(первые 4 колонки - ключ первой таблицы, вторые - второй). Если бы была просто проблема разницы inner с outer было бы что-то типа:
11 12 13 14 11 12 13 14 - строчка есть в обеих таблицах
.  .  .  .  21 22 23 24 - строчка только в первой
31 32 33 34 .  .  .  . - строчка только во второй

(точки означают null).

Пример у меня не получается сделать. Если я ручками набиваю таблицу, то всё работает прекрасно. Поскольку это SAS, я даже не могу сгенерить скрипт, создающий базу... Так что только теоретизировать приходится.

Date: 2008-11-17 04:27 pm (UTC)
From: [identity profile] aguti.livejournal.com
"Ясно. То есть неясно, - сказала Алиса."

Date: 2008-11-24 04:57 am (UTC)
From: [identity profile] alekro.livejournal.com
>outer выводит больше записей
вродь декартовым произведением множеств величали (эх, скок лет приличных запросов ужо не писал)

Date: 2008-11-24 08:30 am (UTC)
From: [identity profile] green-fr.livejournal.com
Стареешь :-) Декартово произведение - это когда join без on clause. Т.е. тупо одно множество перемножаешь на другое. Именно как координаты: для всех X и для всех Y ты создаёшь запись XY.

А по поводу "приличных" - у меня же говно полное. Есть две таблицы, надо проверить, что они "одинаковые".
Т.е. я первым делом проверяю, что все записи есть и слева, и справа - тупой full outer join по полям ключа, с where ключ справа или ключ слева is null.
А вторым делом я проверяю поле за полем: inner join по ключу, вывожу ключ и поле слева, поле справа, where поле слева не равно полю справа. Маленький макрос пробегает по всем полям таблицы и запускает этот запрос.
Быстродействие не нужно, так что об оптимизации поговорим потом :-)
И вот тут я вижу, что full outer join bp gthdjuj pfghjcf "находит" все записи (я специально отключаю where, чтобы убедиться), а inner join из второго не находит ничего! Это же бред, нет разве? Безприменительно к конкретным данным, такого же не бывает?

Date: 2008-12-01 07:01 am (UTC)
From: [identity profile] alekro.livejournal.com
угу, слегка старею :).. картезианское (или кросс) юзается как основа для джоинов (причем не особо эффективная по перформансу, эт я еще в формозЕ на оракле 7-ке видел), аутеры или иннеры - это уже как там предикаты в where строятся.
> Есть две таблицы, надо проверить, что они "одинаковые".
похоже на natural join, но если бывают null, не годиц, приходится иметься как ты описывал.

>full outer join bp gthdjuj pfghjcf "находит" все записи
ну да, и по хорошему именно в виде как ты писал (с наллами в пустых строках а не повторялки данных)

>а inner join из второго не находит ничего!
если взять твоему пример сверху, то первая строчка полностью та же т.е. не покажется в резалте, а остальные - по природе иннер джона не проходят..
я б все таки поигрался с базой, но так времени нет и нет, все какая то фигня под ногами болтается %)

Date: 2008-11-24 04:59 am (UTC)
From: [identity profile] alekro.livejournal.com
если найдецц время, поиграюсь с какой нить ораклушевой (чтоб проверить, в сасе ли дело)..вообще редко когда нужны чистые аутеры, обычно лево-право юзаются

Profile

green_fr: (Default)
green_fr

March 2026

S M T W T F S
1234567
8 91011 121314
15161718192021
22232425262728
293031    

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Mar. 13th, 2026 01:20 am
Powered by Dreamwidth Studios