Объединение таблиц и объединение полей

#sql #sql-server #sql-server-2008-r2

#sql #sql-сервер #sql-server-2008-r2

Вопрос:

Используя MS-SQL 2008r2, у меня есть две таблицы с несколькими вторичными идентификаторами, которые мне нужно объединить в одно представление (для экспорта), которое имеет одну строку для каждого вторичного идентификатора, а данные таблицы объединены в одно поле для каждой таблицы.

 tbl-1 
id | adid | ImImage1 | ImName2 
1 | 1 | Im_a |  Nm _a
2 | 1 | Im_b |  Nm _b
3 | 1 | Im_c |  Nm _c
4 | 2 | Im_x |  Nm _x
5 | 2 | Im_y |  Nm _y
6 | 2 | Im_z |  Nm _z

tbl-2 
id | adid | ImImage1 | ImName1 
1 | 1 | Im_d |  Nm _d
2 | 1 | Im_e |  Nm _e
3 | 1 | Im_f |  Nm _f
4 | 2 | Im_u |  Nm _u
5 | 2 | Im_v |  Nm _v
6 | 2 | Im_w |  Nm_w

Result

adid | ImImage1-tbl1 | ImName2-tbl1 | ImImage1-tbl2 | ImName1-tbl2 
1   Im_a, Im_b, Im_c  |  Nm _a, Nm _b, Nm _c, |  Im_d, Im_e, Im_f, | Nm _d, Nm _e, Nm _f 
2   Im_x, Im_y, Im_z  |  Nm _x, Nm _y, Nm _x  |  Im_u, Im_v, Im_w  | Nm _u, Nm _v, Nm _w
 

На данный момент все, что я, кажется, могу создать, — это очень длинный список, который выглядит так, как будто таблица 1 добавлена к таблице 2 (строка для каждой отдельной adid записи)

Было бы лучше сначала создать представление, которое объединяет каждую таблицу всего в 1 строку adid , затем создать новое представление для их объединения и добавить два других поля? или есть более эффективный способ сделать это?

Комментарии:

1. У вас есть отдельная ads таблица с одной строкой на каждую adid ?

2. Да — adid берется из 3-й таблицы (только с одной строкой на adid, поэтому может использоваться для объединения tbl-1 и tbl-2?)

Ответ №1:

Я думаю, что наиболее эффективным способом сделать это является использование расширений XML SQL Server для объединения строк в одну строку:

 SELECT  ads.ADID,
        [ImImage1-tbl1] = STUFF(i1.val.value('.', 'NVARCHAR(MAX)'), 1, 1, ''),
        [ImName2-tbl1] = STUFF(n1.val.value('.', 'NVARCHAR(MAX)'), 1, 1, ''),
        [ImImage1-tbl2] = STUFF(i2.val.value('.', 'NVARCHAR(MAX)'), 1, 1, ''),
        [ImName1-tbl2] = STUFF(n2.val.value('.', 'NVARCHAR(MAX)'), 1, 1, '')
FROM    AdTable AS Ads
        CROSS APPLY
        (   SELECT  ', '   ImImage1
            FROM    tbl1 AS t
            WHERE   t.AdID = ads.ADID
            FOR XML PATH(''), TYPE
        ) AS i1 (val)
        CROSS APPLY
        (   SELECT  ', '   ImName2
            FROM    tbl1 AS t
            WHERE   t.AdID = ads.ADID
            FOR XML PATH(''), TYPE
        ) AS n1 (val)
        CROSS APPLY
        (   SELECT  ', '   ImImage1
            FROM    tbl2 AS t
            WHERE   t.AdID = ads.ADID
            FOR XML PATH(''), TYPE
        ) AS i2 (val)
        CROSS APPLY
        (   SELECT  ', '   ImName1
            FROM    tbl2 AS t
            WHERE   t.AdID = ads.ADID
            FOR XML PATH(''), TYPE
        ) AS n2 (val);
 

Пример на скрипке SQL