Если вам нужен простой старомодный запрос, который сделает всю работу за вас, см. Ниже:
/* 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 подробная запись для каждого типа, если есть возможность использования нескольких записей для каждого типа, вам потребуется другой подход.