sql, поджоинить null-ы
coalesce?
coalesce?И как оно поможет? Оно в данном контексте от ifnull ничем не отличается.
Сколько ты хочешь получить в результирующей таблице? m*n, min(m,n max(m,n другое?
C coalease имелся в виду вот такой джойн
coalease(t1.a, some value) == coalease(t2.a, some_value)
Либо ты можешь сделать все в одном запросе, когда вместо таблиц, которые ты джойнишь, делаешь подзапрос, в котором обрабатываешь нулы через isnull, например.
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)
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, ''Вот такой конструкции я и хотел бы избежать.
Должно, например, сработать так:Зачем писать мне как решение то, что я сам же в посте указал и сказал, что оно мне не нравится?
...
Или так:
лучше всего избавиться от null
У меня есть таблица из столбцов a1,...,an,b1,...,bm. Я хочу агрегировать её по столбцам a1...an, а столбцы b1...bm переписать через запятую, причём независимо друг от друга.
Пример:
a1 | a2 | b1 | b2 |
a | b | 1 | 1 |
a | b | 1 | 2 |
a | a | 1 | 1 |
a | a | 2 | 2 |
b | a | 1 | 2 |
b | a | 2 | 1 |
На выходе:
a1 | a2 | b1 | b2 |
a | b | 1 | 1,2 |
a | a | 1,2 | 1,2 |
b | a | 1,2 | 1,2 |
Я для этого делаю несколько отдельных агрегатных таблиц:
create table tbi as select a1,...,an,group_concat(bi) as bi from (select distinct a1,...,an,bi from t);
a1 | a2 | b1 |
a | b | 1 |
a | a | 1,2 |
b | a | 1,2 |
А потом делаю общий join:
create table tres as select * from tb1 naural join tb2 ... natural join tbm;
Но вот если в столбцах a1,...,an встречаются null-ы, то всё обламывается на последней сборке.
Зачем писать мне как решение то, что я сам же в посте указал и сказал, что оно мне не нравится?Черт, чукча не читатель
Извини, я внимательнее прочитал ответы, чем вопрос.
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);
в некоторых субд ещё можно настроить, как себя будет вести нулл.
Может, стоит избавиться от NULL-ов в таблице tbi?Ну я в другом месте избавился, но изначально хотелось сохранить их. Вот и спрашивал есть ли ещё какие варианты.
Оставить комментарий
tokuchu
В упрощённом виде есть таблицы:t1:
t2:
Хочу на выходе получить:
Такой запрос:
Не работает, т.к. он не считает, что null == null.
Проблема в том, что столбец, по которому делается join не один, да и самих join-ов несколько. А выписывать огромные выражения с отдельно обработанным случаем null-ов типа: t1.a == t2.a or (t1.a is null and t2.a is null) не хочется, т.к. это выглядеть будет ужасающе.
Какой-нибудь хитрый join для этого не придумали, случайно? "БД" sqlite если что.
Я пока вижу только выход избавиться от null-ов в исходной таблице, там это меньше места займёт.