sql, поджоинить null-ы

tokuchu

В упрощённом виде есть таблицы:
t1:














ab
1a
2b
nullc


t2:














ab
11
22
null3


Хочу на выходе получить:














abc
1a1
2b2
nullc3


Такой запрос:
select * from t1 join t2 using (a)
Не работает, т.к. он не считает, что null == null.
Проблема в том, что столбец, по которому делается join не один, да и самих join-ов несколько. А выписывать огромные выражения с отдельно обработанным случаем null-ов типа: t1.a == t2.a or (t1.a is null and t2.a is null) не хочется, т.к. это выглядеть будет ужасающе.
Какой-нибудь хитрый join для этого не придумали, случайно? :) "БД" sqlite если что.
Я пока вижу только выход избавиться от null-ов в исходной таблице, там это меньше места займёт.

evgen5555

coalesce?

tokuchu

coalesce?
И как оно поможет? Оно в данном контексте от ifnull ничем не отличается.

0000

, как я понял null-ов в каждой таблице может быть несколько, допустим m и n.
Сколько ты хочешь получить в результирующей таблице? m*n, min(m,n max(m,n другое?
C coalease имелся в виду вот такой джойн

coalease(t1.a, some value) == coalease(t2.a, some_value)

Ve9443

ну ты можешь использовать временную таблицу, где вместо нулов будут стоять нули, например.
Либо ты можешь сделать все в одном запросе, когда вместо таблиц, которые ты джойнишь, делаешь подзапрос, в котором обрабатываешь нулы через isnull, например.

zorin29

Должно, например, сработать так:

select * from t1 join t2 on isnull(t1.a, -1) = isnull(t2.a,-1)

Или так:

select * from t1 join t2 on (t1.a is null and t2.a is null) or (t1.a = t2.a)

tokuchu

C coalease имелся в виду вот такой джойн
Ну это понятно, но я писал, что меня такое не устраивает, т.к. у меня много столбцов и вместо "natural left join" мне придётся написать:
left join on (ifnull(t1.a, '') == ifnull(t2.a, '') and ifnull(t1.b, '') == ifnull(t2.b, '') and ifnull(t1.c, '') == ifnull(t2.c, '') and ifnull(t1.d, '') == ifnull(t2.d, '') and ifnull(t1.e, '') == ifnull(t2.e, '') and ifnull(t1.f, '') == ifnull(t2.f, ''
Вот такой конструкции я и хотел бы избежать.

tokuchu

Должно, например, сработать так:
...
Или так:
Зачем писать мне как решение то, что я сам же в посте указал и сказал, что оно мне не нравится? :grin:

hprt

лучше всего избавиться от null

tokuchu

Напишу заодно и исходную задачу на всякий случай.
У меня есть таблица из столбцов a1,...,an,b1,...,bm. Я хочу агрегировать её по столбцам a1...an, а столбцы b1...bm переписать через запятую, причём независимо друг от друга.
Пример:























a1a2b1b2
ab11
ab12
aa11
aa22
ba12
ba21


На выходе:














a1a2b1b2
ab11,2
aa1,21,2
ba1,21,2


Я для этого делаю несколько отдельных агрегатных таблиц:
create table tbi as select a1,...,an,group_concat(bi) as bi from (select distinct a1,...,an,bi from t);















a1a2b1
ab1
aa1,2
ba1,2


А потом делаю общий join:
create table tres as select * from tb1 naural join tb2 ... natural join tbm;

Но вот если в столбцах a1,...,an встречаются null-ы, то всё обламывается на последней сборке.

zorin29

Зачем писать мне как решение то, что я сам же в посте указал и сказал, что оно мне не нравится?
Черт, чукча не читатель :)
Извини, я внимательнее прочитал ответы, чем вопрос.

zorin29

Может, стоит избавиться от NULL-ов в таблице tbi?

create table tbi as select isnull(a1, -1) a1,... , isnull(an, -1) an,group_concat(bi) as bi from (select distinct a1, ..., an,bi from t);

kill-still

в некоторых субд ещё можно настроить, как себя будет вести нулл.

tokuchu

Может, стоит избавиться от NULL-ов в таблице tbi?
Ну я в другом месте избавился, но изначально хотелось сохранить их. Вот и спрашивал есть ли ещё какие варианты.
Оставить комментарий
Имя или ник:
Комментарий: