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

Откуда:
Сообщений: 4
Здравствуйте!
Нужна помощь, никак не могу найти решение следующей задачке:

Есть три таблицы:
--------таблица T0--------------
ID
0
1
2
3
4


----------таблица T1------------
IDZag
1Заготовка111
1Заготовка222
1Заготовка333
2Заготовка111
2Заготовка222
3Заготовка111

----------таблица T2------------
IDWay
1Маршрут111
1Маршрут222
2Маршрут111
2Маршрут222
2Маршрут333


Необходимо запросом получить таблицу вида (без использования INSERT и UPDATE):
----------таблица T3------------
IDZagWay
0NULLNULL
1Заготовка111Маршрут111
1Заготовка222Маршрут222
1Заготовка333NULL
2Заготовка111Маршрут111
2Заготовка222Маршрут222
2NULLМаршрут333
3Заготовка111NULL
4NULLNULL


P.S. Используется MS SQL 2005

текст примера
+
DECLARE @T0 TABLE
(
ID int
)

DECLARE @T1 TABLE
(
ID int,
Zag nvarchar(15)
)

DECLARE @T2 TABLE
(
ID int,
Way nvarchar(15)
)
DECLARE @T3 TABLE
(
ID int,
Zag nvarchar(15),
Way nvarchar(15)
)
INSERT INTO @T0 VALUES (0)
INSERT INTO @T0 VALUES (1)
INSERT INTO @T0 VALUES (2)
INSERT INTO @T0 VALUES (3)
INSERT INTO @T0 VALUES (4)

INSERT INTO @T1 VALUES (1, 'Заготовка 111')
INSERT INTO @T1 VALUES (1, 'Заготовка 222')
INSERT INTO @T1 VALUES (1, 'Заготовка 333')
INSERT INTO @T1 VALUES (2, 'Заготовка 111')
INSERT INTO @T1 VALUES (2, 'Заготовка 222')
INSERT INTO @T1 VALUES (3, 'Заготовка 111')

INSERT INTO @T2 VALUES (1, 'Маршрут 111')
INSERT INTO @T2 VALUES (1, 'Маршрут 222')
INSERT INTO @T2 VALUES (2, 'Маршрут 111')
INSERT INTO @T2 VALUES (2, 'Маршрут 222')
INSERT INTO @T2 VALUES (2, 'Маршрут 333')

INSERT INTO @T3 VALUES (1,'Заготовка 111', 'Маршрут 111')
INSERT INTO @T3 VALUES (1,'Заготовка 222', 'Маршрут 222')
INSERT INTO @T3 VALUES (1,'Заготовка 333', NULL)
INSERT INTO @T3 VALUES (2,'Заготовка 111', 'Маршрут 111')
INSERT INTO @T3 VALUES (2,'Заготовка 222', 'Маршрут 222')
INSERT INTO @T3 VALUES (2,NULL, 'Маршрут 333')
INSERT INTO @T3 VALUES (3, 'Заготовка 111', NULL)
27 июн 12, 18:35    [12784833]     Ответить | Цитировать Сообщить модератору
 Re: "Склеивание" нескольких таблиц в одну по одному из столбцов  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
Rash843,

вам нужен JOIN
27 июн 12, 18:41    [12784867]     Ответить | Цитировать Сообщить модератору
 Re: "Склеивание" нескольких таблиц в одну по одному из столбцов  [new]
Rash843
Member

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

Если бы все так было просто...))) Обычный JOIN (в данном случае LEFT JOIN) нужного результата не дает...

К примеру, если для конкретного значения id на каждую запись из таблицы T1 приходится n1 записей, и из таблицы T2 приходится n2 Записей, то обычный последовательный LEFT JOIN таблиц T1 и T2 к таблице T0 по полю id приводит к кол-ву записей N= n1*n2, еще и с дублированием данных (вместо которых должны быть NULL).
27 июн 12, 21:42    [12785409]     Ответить | Цитировать Сообщить модератору
 Re: "Склеивание" нескольких таблиц в одну по одному из столбцов  [new]
ultima
Member

Откуда: СПб
Сообщений: 121
Rash843
----------таблица T1------------
IDZag
1Заготовка111
1Заготовка222
1Заготовка333
2Заготовка111
2Заготовка222
3Заготовка111


Подумайте над изменением архитектуры первичных данных, таблицы T1 и T2 не нормальные, ID не первичный ключ
27 июн 12, 22:36    [12785576]     Ответить | Цитировать Сообщить модератору
 Re: "Склеивание" нескольких таблиц в одну по одному из столбцов  [new]
invm
Member

Откуда: Москва
Сообщений: 9913
with a as
(
 select
  t0.ID, t1.Zag, row_number() over (partition by t0.ID order by t1.Zag) as n
 from
  @T0 t0 left join
  @T1 t1 on t1.ID = t0.ID
),
b as
(
 select
  t0.ID, t2.Way, row_number() over (partition by t0.ID order by t2.Way) as n
 from
  @T0 t0 left join
  @T2 t2 on t2.ID = t0.ID
)
select
 isnull(a.ID, b.ID), a.Zag, b.Way
from
 a full join
 b on b.ID = a.ID and b.n = a.n
27 июн 12, 23:09    [12785730]     Ответить | Цитировать Сообщить модератору
 Re: "Склеивание" нескольких таблиц в одну по одному из столбцов  [new]
Rash843
Member

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

Это лишь тестовый пример. По факту есть множество таблиц, каждая из которых хранит какие либо данные для некого множества объектов со своими id. Эти таблицы связаны между собой лишь ссылкой на объект.
Неужели нет варианта свести эти данные в одну таблицу, имеющею вид своеобразного отчета (исключая дублирование полей данных для каждого объекта).
Конечно, можно формировать данную таблицу как временную, использую INSERT и UPDATE, либо обработать результат запроса, формируемого последовательным LEFT JOIN, программным путем, используя язык программирования.
Но все же хочется решить данную задачу средствами T-SQL, причем без INSERT и UPDATE (для скорости).
27 июн 12, 23:19    [12785793]     Ответить | Цитировать Сообщить модератору
 Re: "Склеивание" нескольких таблиц в одну по одному из столбцов  [new]
Rash843
Member

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

Благодарю, все работает как надо!!!
28 июн 12, 09:42    [12786726]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить