Денормализовать данные для t-sql - PullRequest
0 голосов
/ 22 ноября 2011

У меня есть набор данных, который имеет отношение 1 ко многим, то есть: Контактная информация:

ContID  Country  Add1   Add2  City   ect...
001       USA     123  N/A   Blah

Над заголовком записи

Деталь:

ContID  ContType  PhNum    Ext
001       FAX     11111   X222
001       BUSN    33333   X444

Моя конечная цель - создать новые записи, которые выглядят так:

ContID  Country Add1  Add2  City ContType1  ContType2  PhNum1  PhNum2  Ext1  Ext2        
001       USA    123  N/A   Blah   FAX        BUSN      11111    3333  x222  x444         

Я полагаю, что есть несколько способов принять это, потому что XML - это один путь, и, возможно, стержень - другой. Я не очень хорошо разбираюсь в FOR XML и думаю, что это может быть лучшим вариантом.

1 Ответ

0 голосов
/ 24 ноября 2011

Если вам нужен простой старомодный запрос, который сделает всю работу за вас, см. Ниже:

/* Table declaractions and inserts for testing only, you will need to amend for 
 * your own structure.
 */

DECLARE @ContactInfo TABLE ( ContID int identity(1,1),
                             Country varchar(10), 
                             Add1 varchar(20),
                             Add2 varchar(20),
                             City varchar(10))
INSERT INTO @ContactInfo(Country, Add1, Add2, City)
VALUES ('USA','123','N/A','Blah')

DECLARE @ContactDetail TABLE ( ContID int,
                             ContType varchar(5), 
                             PhNum varchar(10),
                             Ext varchar(10))
INSERT INTO @ContactDetail(ContID, ContType, PhNum, Ext)
VALUES (1, 'Fax','11111','X1111')
INSERT INTO @ContactDetail(ContID, ContType, PhNum, Ext)
VALUES (1, 'Busn','22222','X2222')
INSERT INTO @ContactDetail(ContID, ContType, PhNum, Ext)
VALUES (1, 'Mobi','33333','X3333')
INSERT INTO @ContactDetail(ContID, ContType, PhNum, Ext)
VALUES (1, 'Home','44444','X4444')

SELECT ci.ContId
, cd1.ContType ContType1, cd1.PhNum PhNum1, cd1.Ext Ext1
, cd2.ContType ContType2, cd2.PhNum PhNum2, cd2.Ext Ext2
, cd3.ContType ContType3, cd3.PhNum PhNum3, cd3.Ext Ext3
, cd4.ContType ContType4, cd4.PhNum PhNum4, cd4.Ext Ext4
FROM  @ContactInfo ci
INNER JOIN @ContactDetail cd1 ON cd1.ContId = ci.ContId AND cd1.ContType = 'Fax'
INNER JOIN @ContactDetail cd2 ON cd2.ContId = ci.ContId AND cd2.ContType = 'Busn'
INNER JOIN @ContactDetail cd3 ON cd3.ContId = ci.ContId AND cd3.ContType = 'Mobi'
INNER JOIN @ContactDetail cd4 ON cd4.ContId = ci.ContId AND cd4.ContType = 'Home'

Основная предпосылка заключается в том, что каждое соединение от @ContactInfo до ContactDetail представляет 1 из ваших типов. Это будет хорошо работать, если у вас есть только 1 подробная запись для каждого типа, если есть возможность использования нескольких записей для каждого типа, вам потребуется другой подход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...