Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Объединение данных  [new]
On1yMe
Member

Откуда:
Сообщений: 30
Есть такие данные:

#id:
idname
1melada


#pu:
idmonth
1march
1april
1may
1june


#ca:
idagent
1aA
1aB



Логическая связь существует только между #id и #pu, #id и #ca. Данные в таблицах #ca и #pu никак не связаны между собой, только относятся к одним и тем же элементам в #id.
Нужно получить:
idnamemonthagent
1meladamarchaA
1meladaaprilaB
1meladamayNULL
1meladajuneNULL


Вместо NULL можно (и наверно даже лучше) получить строку "".
Насколько такое вообще реально средствами t-sql?
8 фев 12, 12:51    [12053059]     Ответить | Цитировать Сообщить модератору
 Re: Объединение данных  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
On1yMe,

чем же май хуже марта??
8 фев 12, 12:53    [12053078]     Ответить | Цитировать Сообщить модератору
 Re: Объединение данных  [new]
iljy
Member

Откуда:
Сообщений: 8711
On1yMe,

легко. Вам помогут JOIN/CROSS JOIN, ROW_NUMBER и ISNULL.
8 фев 12, 13:08    [12053263]     Ответить | Цитировать Сообщить модератору
 Re: Объединение данных  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iljy
On1yMe,

легко. Вам помогут JOIN/CROSS JOIN, ROW_NUMBER и ISNULL.
Как же они помогут при такой структуре?
Ничего не поможет.
Разве что устраивают любые случайные данные. Но зачем тогда это всё?
8 фев 12, 13:12    [12053304]     Ответить | Цитировать Сообщить модератору
 Re: Объединение данных  [new]
Glory
Member

Откуда:
Сообщений: 104751
Март наверное лучше мая потому, что в календаре стоит выше ?
8 фев 12, 13:13    [12053313]     Ответить | Цитировать Сообщить модератору
 Re: Объединение данных  [new]
iljy
Member

Откуда:
Сообщений: 8711
iap
iljy
On1yMe,

легко. Вам помогут JOIN/CROSS JOIN, ROW_NUMBER и ISNULL.
Как же они помогут при такой структуре?
Ничего не поможет.
Разве что устраивают любые случайные данные. Но зачем тогда это всё?

Первые 2 таблица соединяются по id, дальше 3я присоединяется по id+ROW_NUMBER. Как-то так. Но структура конечно бредовая, спору нет.
8 фев 12, 13:15    [12053334]     Ответить | Цитировать Сообщить модератору
 Re: Объединение данных  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Glory
Март наверное лучше мая потому, что в календаре стоит выше ?
На это нет никаких указаний.
Это мы знаем, что март раньше мая.
А сервер знает?
8 фев 12, 13:18    [12053386]     Ответить | Цитировать Сообщить модератору
 Re: Объединение данных  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
On1yMe,

в результирующей таблице, которую вы привели, как вы сопоставили строки? просто по порядку следования в таблицах?
Тогда что-то вроде этого
/*
create table #id(id int,name varchar(10));
insert #id values(1,'melada');
create table #pu(id int,[month] varchar(10),ord int identity);
insert #pu(id,[month]) values (1,'march'),(1,'april'),(1,'may'),(1,'june');
create table #ca (id int,agent varchar(10),ord int identity);
insert #ca(id,agent) values(1,'aA'),(1,'aB');
*/
go
with p as
(
select *, rn=row_number() over(partition by id order by ord/*либо поменяйте ord на нужное поле по которому упорядочивать*/) from #pu
),
c as
(
select *, rn=row_number() over(partition by id order by ord) from #ca
)
select
	*
from
	#id i
	join p on p.id = i.id
	left /*full*/ join c on c.id = i.id and c.rn = p.rn
8 фев 12, 13:28    [12053521]     Ответить | Цитировать Сообщить модератору
 Re: Объединение данных  [new]
On1yMe
Member

Откуда:
Сообщений: 30
Порядок не важен никакой вообще. Да, структура тупая, но изначальная задача - выгрузить таким макаром приличный кусок разных данных в CSV, который далее будет парситься софтом, куда данные загружаются.
Данных много - делать много CSV (по файлу на таблицу) очень не хочется, а использование джоинов множит количество строк в CSV в сотни раз.

То есть изначально есть 1 таблица, в которой данные одного объекта - 1 строка. И есть еще штук 15 таблиц с разными параметрами объектов, в которых на один объект отводится по 2-5-10 строк. Использование left join/full join приводит к тому, что для сотни объектов со всеми параметрами из других таблиц получается миллион строк.
8 фев 12, 14:59    [12054701]     Ответить | Цитировать Сообщить модератору
 Re: Объединение данных  [new]
On1yMe
Member

Откуда:
Сообщений: 30
SomewhereSomehow,

Работает, спасибо. Осталось только понять как именно оно работает.
8 фев 12, 16:18    [12055731]     Ответить | Цитировать Сообщить модератору
 Re: Объединение данных  [new]
On1yMe
Member

Откуда:
Сообщений: 30
SomewhereSomehow,

Как работает понял. Появился другой вопрос: в джоинах надо сравнивать rn, то есть сравнивать его надо с таблицей, в которой количество строк, требуемых в выводе, максимально. Как быть если заранее неизвестно в какой таблице кол-во строк максимально?
8 фев 12, 16:44    [12056119]     Ответить | Цитировать Сообщить модератору
 Re: Объединение данных  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
On1yMe
SomewhereSomehow,

Как работает понял. Появился другой вопрос: в джоинах надо сравнивать rn, то есть сравнивать его надо с таблицей, в которой количество строк, требуемых в выводе, максимально. Как быть если заранее неизвестно в какой таблице кол-во строк максимально?
А FULL JOIN на что?
8 фев 12, 16:47    [12056147]     Ответить | Цитировать Сообщить модератору
 Re: Объединение данных  [new]
On1yMe
Member

Откуда:
Сообщений: 30
go
with p as
(
select *, rn=row_number() over(partition by id order by id) from #pu
),
c as
(
select *, rn=row_number() over(partition by id order by id) from #ca
)
select
	*
from
	#id i
	--join p on p.id = i.id
	--left /*full*/ join c on c.id = i.id and c.rn = p.rn
	join c on c.id = i.id
	full join p on p.id = i.id and p.rn = c.rn



idnameidagentrnidmonthrn
1melada1aA11march1
1melada1aB21april2
NULLNULLNULLNULLNULL1may3
NULLNULLNULLNULLNULL1june4


Таким образом теряются значения id.id, id.name, чего терять нельзя, т.к. парсерсу они необходимы для идентификации объекта.
8 фев 12, 17:11    [12056479]     Ответить | Цитировать Сообщить модератору
 Re: Объединение данных  [new]
iljy
Member

Откуда:
Сообщений: 8711
On1yMe,

порядок соединений поменяйте
8 фев 12, 17:17    [12056542]     Ответить | Цитировать Сообщить модератору
 Re: Объединение данных  [new]
On1yMe
Member

Откуда:
Сообщений: 30
iljy,

Ну да, если соединять от большего к меньшему - все хорошо, либо если первым джоином ставить бОльшую таблицу - тоже хорошо.
Я повторюсь: заранее неизвестно, какая таблица окажется бОльшей для конкретного id.id. Для разных id.id разные таблицы будут бОльшими.
8 фев 12, 17:21    [12056594]     Ответить | Цитировать Сообщить модератору
 Re: Объединение данных  [new]
iljy
Member

Откуда:
Сообщений: 8711
On1yMe,

сначала надо выполнить FULL JOIN, потом к результату делать JOIN.
8 фев 12, 17:22    [12056609]     Ответить | Цитировать Сообщить модератору
 Re: Объединение данных  [new]
On1yMe
Member

Откуда:
Сообщений: 30
iljy,

И получится так:
1 melada 1 aA 1 1 march 1
1 melada 1 aB 2 1 april 2
8 фев 12, 17:29    [12056692]     Ответить | Цитировать Сообщить модератору
 Re: Объединение данных  [new]
iljy
Member

Откуда:
Сообщений: 8711
On1yMe,

это почему это??
А вообще, если хотите получить ответ, сделайте скрипт данных.
8 фев 12, 17:33    [12056728]     Ответить | Цитировать Сообщить модератору
 Re: Объединение данных  [new]
On1yMe
Member

Откуда:
Сообщений: 30
iljy,

iljy,

Не совсем понял про скрипт данных.
Желающие поковыряться могут взять данные из первого поста. В общем виде задача сводится к такой:
Имеется таблица #id, содержащая имя объекта и его уникальный id. В этой таблице один объект описывается только одной строкой.
Имеется также 15 таблиц вида #pu и #ca, в которых первая колонка - всегда id объекта, остальные колонки - различные данные. В этих таблицах один и тот же объект может описываться произвольным количеством строк.
Необходимо вывести в итоге такое минимальное количество строк на объект, которое бы полностью содержало все данные из всех 15ти таблиц. Количество строк, описывающих каждый конкретный id в каждой конкретной таблице заранее неизвестно и разное для разных id.
8 фев 12, 18:10    [12056996]     Ответить | Цитировать Сообщить модератору
 Re: Объединение данных  [new]
iljy
Member

Откуда:
Сообщений: 8711
On1yMe,

https://www.sql.ru/forum/actualthread.aspx?tid=127456
8 фев 12, 18:11    [12057004]     Ответить | Цитировать Сообщить модератору
 Re: Объединение данных  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
On1yMe,

Так и знал, что подобный вопрос возникнет, специально оставил намек на full join. Желательно сразу данные репрезентативные давать, чтоб догадками не заниматься.
/*
create table #id(id int,name varchar(10));
insert #id values(1,'melada');
create table #pu(id int,[month] varchar(10),ord int identity);
insert #pu(id,[month]) values (1,'march'),(1,'april'),(1,'may'),(1,'june');
create table #ca (id int,agent varchar(10),ord int identity);
insert #ca(id,agent) values(1,'aA'),(1,'aB'),(1,'aC'),(1,'aD'),(1,'aE');
*/
go
with p as
(
select *, rn=row_number() over(partition by id order by ord) from #pu
),
c as
(
select *, rn=row_number() over(partition by id order by ord) from #ca
),
pc as
(
select
	id = isnull(c.id,p.id),
	p.[month],
	c.[agent]
from
	p
	full join c on p.id = c.id and p.rn = c.rn
)
select
	*
from
	#id i
	join pc on pc.id = i.id
Не знаю, как это чудо будет работать по скорости... и вообще, как с такой мешаниной будет парсер работать, по мне так лучше было б xml как-то формировать, он более удобен для последующего разбора. Имхо, конечно.
8 фев 12, 19:30    [12057486]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить