对t-sql的数据进行去标准化

时间:2011-11-22 15:41:49

标签: tsql

我有一个具有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 :(得分:0)

如果你想要一个简单的老式查询来完成这项工作,请看下面的内容:

/* 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个详细条目,如果每种类型都有多个条目可能,那么这将工作正常,那么您将需要不同的方法。