Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как сцепить 2 таблицы так, чтобы появились дополнительные строки с null? / 12 сообщений из 12, страница 1 из 1
27.01.2021, 19:37
    #40039460
Nika gnome
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сцепить 2 таблицы так, чтобы появились дополнительные строки с null?
Есть таблица

Страны:
страна_Id Страна1 Россия2 Белоруссия

Города:
город_id страна_id город11Москва22Минск
делаю "join" такой, что получаю таблицу
Страна ГородРоссияРоссия МоскваБелоруссияБелоруссия Минск

Запрос большой и таких сцепок нужно в одном запросе сделать штук 8 разных. И полей там в каждой из этих таблиц штук по 10-20. Поэтому каким-нибудь Union / Union All пользоваться не хотелось бы
...
Рейтинг: 0 / 0
27.01.2021, 19:42
    #40039461
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сцепить 2 таблицы так, чтобы появились дополнительные строки с null?
Nika gnome,

где запрос-то?
Для показанного примера, разумеется
...
Рейтинг: 0 / 0
27.01.2021, 19:43
    #40039462
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сцепить 2 таблицы так, чтобы появились дополнительные строки с null?
Nika gnome,

где сам то запрос который вы написали
...
Рейтинг: 0 / 0
27.01.2021, 19:50
    #40039464
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сцепить 2 таблицы так, чтобы появились дополнительные строки с null?
Nika gnome
делаю "join" такой, что получаю таблицу
Вы забыли условия связывания - условия, устанавливающие соответствие записей таблиц. Которые ON clause.

PS. Если JOIN без ON выполнился... а у Вас точно SQL Server?
...
Рейтинг: 0 / 0
27.01.2021, 19:58
    #40039466
Nika gnome
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сцепить 2 таблицы так, чтобы появились дополнительные строки с null?
Код: sql
1.
2.
3.
select Страна, город
from Страны join города
   on страна_Id=страна_Id


sql server 2017

Решения, которые не нравятся:
Код: sql
1.
2.
3.
4.
5.
6.
select Страна, город
from Страны join города
   on страна_Id=страна_Id
union
select Страна, null
from Страны 


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select Страна, город
from Страны 
    outer apply 
    (
        select * from города 
        where  страны.страна_Id=города.страна_Id 
        union 
        select страны.страна_id null, null, ...???, null ) города


Есть возможность выполнить задачу без использования union?
...
Рейтинг: 0 / 0
27.01.2021, 20:09
    #40039467
vikkiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сцепить 2 таблицы так, чтобы появились дополнительные строки с null?
Nika gnome,

накинь поверху group by с grouping sets (cube и rollup в данном случае не очень подходят)
...
Рейтинг: 0 / 0
27.01.2021, 20:45
    #40039473
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сцепить 2 таблицы так, чтобы появились дополнительные строки с null?
Nika gnome,

это что ли?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
declare @countries table (
     [id] int,
     [name] sysname
);

declare @cities table (
     [id] int,
     [country_id] int,
     [name] sysname
);

insert into @countries ([id], [name]) values (1, 'Russia'), (2, 'Belarus');
insert into @cities ([id], [country_id], [name]) values (1, 1, 'Moscow'), (2, 2, 'Minsk');

select
      c1.[name],
      iif(c1.[id] = c2.[country_id], c2.[name], null) as [city]
from @countries c1
cross join @cities c2
order by c1.[name] desc, 2 asc;
...
Рейтинг: 0 / 0
27.01.2021, 20:56
    #40039476
Nika gnome
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сцепить 2 таблицы так, чтобы появились дополнительные строки с null?
grouping sets, cube и rollup - штука крутая, буду использовать.

Но всё ж не обойдётся без более подробного описания задачи.

Есть географический справочник
ID parent_iD наименование1 null Россия2 null Белоруссия3 1 Москва4 2 Минск
Географический справочник "ровный", на первом уровне всегда страны, на втором всегда города, на третьем всегда улицы, и т.д. Т.е. нормальная такая идеальная география.

Требуется иерархию превратить в "плоский" список.
ID Страна Город...1 Россия null...3 Россия Москва...2 Белоруссия null...4 Белоруссия Минск...
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT
	g1.Наименование Страна
	, g2.Наименование Город
	, g3.Наименование Улица
	, g4.Наименование Дом
        , coalesce(g4.ID,g3.ID,g2.ID,g1.ID) ID
FROM География g1
	left join География g2 on g1.ID= g2.ParentID
	left join География g3 on g2.ID = g3.ParentID
	left join География g4 on g3.ID = g4.ParentID
where g1.ParentID is null


это работает, но тут не хватает строк с пустыми городами.
Если города у страны не будет, то left join сделает свою работу и страну с пустым городом я получу.
...
Рейтинг: 0 / 0
27.01.2021, 20:56
    #40039477
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сцепить 2 таблицы так, чтобы появились дополнительные строки с null?
Nika gnome,

"не нравятся" Вы эстет, что ли? В математике нет понятия "нравится". Здесь требования или выполняются или не выполняются. Чтобы каждый раз не писать одно и тоже используйте CTE.
...
Рейтинг: 0 / 0
27.01.2021, 20:58
    #40039478
Nika gnome
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сцепить 2 таблицы так, чтобы появились дополнительные строки с null?
надо было сразу в этом виде сформулировать вопрос...
...
Рейтинг: 0 / 0
28.01.2021, 05:54
    #40039527
PizzaPizza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сцепить 2 таблицы так, чтобы появились дополнительные строки с null?
Nika gnome

Географический справочник "ровный", на первом уровне всегда страны, на втором всегда города, на третьем всегда улицы, и т.д.

для городов вы не получаете null, а для улиц получаете?
или это нужно исключительно для городов, а для улиц "и т.д." не надо null ?

Nika gnome

Запрос большой и таких сцепок нужно в одном запросе сделать штук 8 разных.

Сложно понять как это выглядит у вас в голове. Справочник вроде один должен быть и собираться единожды, а "сцепок" у вас 8 откуда то.
...
Рейтинг: 0 / 0
28.01.2021, 07:32
    #40039533
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сцепить 2 таблицы так, чтобы появились дополнительные строки с null?
Nika gnome
Код: sql
1.
2.
3.
select Страна, город
from Страны join города
   on страна_Id=страна_Id



sql server 2017

А вот теперь скажите... Вы всерьёз рассчитываете, что в on страна_Id=страна_Id поля будут браться из разных таблиц? да с какой стати?

И я не верю, что у Вас SQL Server - ибо ЭТОТ запрос на нём гарантированно приведёт к ошибке "Msg 209 Level 16 State 1 Line X: Ambiguous column name 'страна_Id'".

Nika gnome
Есть возможность выполнить задачу без использования union?

Код: sql
1.
2.
3.
4.
5.
6.
SELECT DISTINCT Страны.Страна,
                CASE WHEN Страны.страна_Id = Города.страна_Id
                     THEN Города.город
                     END город
FROM Страны
CROSS JOIN Города
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как сцепить 2 таблицы так, чтобы появились дополнительные строки с null? / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]