СОЕДИНИТЕ три таблицы и объедините данные из нескольких строк для каждой строки DISTINCT в отдельном столбце
СОЕДИНИТЕ три таблицы и объедините данные из нескольких строк для каждой строки DISTINCT в отдельном столбце
У меня есть таблица, где один элемент сопоставлен с несколькими элементами.
Key 1 | Key 2
1 2
1 5
1 6
1 4
1 8
У меня есть другой стол, как это
Key 1 | ShortKey1Desc
1 'Desc short'
у меня есть еще одна таблица, где у меня есть такие данные
Key 1 | Description
1 'Desc a'
1 'Desc c'
1 'Desc aa'
1 'Desc tt'
мне нужно написать SQL-запрос для моего представления, где будет сгенерирована таблица, как это
Key 1 | AllKeys2ForKey1 | AllDescriptionsForKey1 | ShortKey1Desc
1 | 2;5;6;4;8 | Desc a; Desc c; Desc aa; Desc tt | Desc short
Ключ 1 - это поле строкового типа, поэтому мне нужно присоединиться к ним с помощью этого строкового ключа.
Я пытаюсь создать представление для удобного доступа к данным. нужно создать запрос, что не займет много времени. я уже пытался сделать это с помощью функций, но это требует возраста для загрузки.
любая помощь по этому вопросу будет высоко ценится. большое спасибо
3 ответа
Предполагая, что вы не можете изменить структуры данных, чтобы сделать более эффективный запрос, это будет работать:
--Populate sample data
SELECT 1 as key1, 2 as key2 INTO #tbl1
UNION ALL SELECT 1, 5
UNION ALL SELECT 1, 6
UNION ALL SELECT 1, 4
UNION ALL SELECT 1, 8
SELECT 1 as key1, 'Desc short' as shortkeydesc INTO #tbl2
SELECT 1 as key1, 'Desc a' as [description] INTO #tbl3
UNION ALL SELECT 1, 'Desc c'
UNION ALL SELECT 1, 'Desc aa'
UNION ALL SELECT 1, 'Desc tt'
--Combine data into semi-colon separated lists
SELECT
key1
,STUFF(
(
SELECT
';' + CAST(t2.key2 AS VARCHAR(10))
FROM #tbl1 t2
WHERE t2.key1 = tbl1.key1
FOR XML PATH('')
), 1, 1, ''
)
,STUFF(
(
SELECT
';' + tbl2.shortkeydesc
FROM #tbl2 tbl2
WHERE tbl2.key1 = tbl1.key1
FOR XML PATH('')
), 1, 1, ''
)
,STUFF(
(
SELECT
';' + tbl3.[description]
FROM #tbl3 tbl3
WHERE tbl3.key1 = tbl1.key1
FOR XML PATH('')
), 1, 1, ''
)
FROM #tbl1 tbl1
GROUP BY tbl1.key1
Вы должны написать агрегатную функцию CLR для решения этого вопроса. для записи Функция агрегирования CLR: 1: Запустите Microsoft Visual Stadio 2: Создайте новый проект 3: затем выберите Проект данных 4: Функция агрегирования CLR
После создания вашей агрегатной функции создайте свой запрос, например ниже
Select A.Key1, OwnAggregateFn(B.Description), OwnAggregateFn(C.Key2), ...
From A
inner join B ON B.Key1 = A.Key1
inner join C ON C.Key1 = A.Key1
...
Group By A.Key1
Чтобы преобразовать строки в один результат, вам нужно сохранить значения в переменной, ниже приведен пример кода, чтобы дать вам представление
Declare @AllKeys2ForKey1 varchar(50)
set @AllKeys2ForKey1 = ''
SELECT @AllKeys2ForKey1 = @AllKeys2ForKey1 + cast([Key 2] as varchar(3)) + ','
FROM [AllKeys2ForKey1Table] where [KEY 1] = 1
Declare @AllDescriptionsForKey1 varchar(100)
set @AllDescriptionsForKey1 = ''
SELECT @AllKeys2ForKey1 = @AllKeys2ForKey1 + [Description] + ','
FROM [AllDescriptionsForKey1Table] where [KEY 1] = 1
Declare @ShortKey1Desc varchar(100)
set @ShortKey1Desc = ''
SELECT @ShortKey1Desc = @ShortKey1Desc + [ShortKey1Desc] + ','
FROM [ShortKey1DescTable] where [KEY 1] = 1
Select [KEY 1],
substring(@AllKeys2ForKey1,1,len(@AllKeys2ForKey1) - 1) as 'AllKeys2ForKey1 ',
substring(@AllDescriptionsForKey1,1,len(@AllDescriptionsForKey1) - 1) as 'AllDescriptionsForKey1',
substring(@ShortKey1Desc,1,len(@ShortKey1Desc) - 1) as 'ShortKey1Desc'
from Table where [KEY 1]= 1