私は、後続のサンプルデータを作成しました。私は、私は2つの一時テーブルを作成し、別の2を挿入することを計画していた以下の マスタレコードを使用して異なるタイプのデータを単一の行に問い合わせる
のように1つの行
すなわちとしての私の情報を取得するには、上記の表を照会する必要が
別々のアドレスの種類。次に、社内のメインテーブルに内部を結合します。私は確信していません、これは良い解決策です。誰かが私の問題に自分の考えやコードを分かち合っているかどうかは分かりません。
私は、後続のサンプルデータを作成しました。私は、私は2つの一時テーブルを作成し、別の2を挿入することを計画していた以下の マスタレコードを使用して異なるタイプのデータを単一の行に問い合わせる
のように1つの行
すなわちとしての私の情報を取得するには、上記の表を照会する必要が
別々のアドレスの種類。次に、社内のメインテーブルに内部を結合します。私は確信していません、これは良い解決策です。誰かが私の問題に自分の考えやコードを分かち合っているかどうかは分かりません。
をフィールドリストを指定する必要があり、これを試してみてください。..
Select companyId,CompanyName,homesddress1
,homeaddress2,HomePostCode,OfficeAddress1,OfficeAddress2,OfficePostCode
From tblCompany a
Outer apply (select address1 homesddress1, address2 homeaddress2,postcode HomePostCode
From tblAddress t
Where AddressType='home' and t.companyid=a.companyid)
Outer apply (select address1 OfficeAddress1, address2 Officeaddress2,postcode OfficePostCode
From tblAddress t2
Where AddressType='Office ' and t2.companyid=a.companyid)
2つの外部結合を使用して簡単な選択で行うことができます。一部の企業では1つのアドレスしか持てないため、結合する必要があることに注意してください。
DECLARE @company TABLE (
CompanyId int,
CompanyName varchar(50)
)
DECLARE @companyAddress TABLE (
Id int,
AddressType varchar(10),
Address1 varchar(50),
Address2 varchar(50),
Postcode varchar(10),
CompanyId int
)
INSERT INTO @company VALUES (1, 'Test Company')
INSERT INTO @companyAddress VALUES (1, 'Home', '25 Street', 'City 1', 'BA3 1PE', 1)
INSERT INTO @companyAddress VALUES (2, 'Office', '25 Street', 'City 2', 'NA1 4TW', 1)
SELECT c.CompanyId, c.CompanyName,
h.Address1 AS HomeAddress1, h.Address2 AS HomeAddress2, h.Postcode AS HomePostcode,
o.Address1 AS OfficeAddress1, o.Address2 AS OfficeAddress2, o.Postcode AS OfficePostcode
FROM @company c
LEFT JOIN
@companyAddress h ON h.CompanyId = c.CompanyId AND h.AddressType = 'Home'
LEFT JOIN
@companyAddress o ON o.CompanyId = c.CompanyId AND o.AddressType = 'Office'
ここではほぼダイナミックなバージョンです。あなただけの
Declare @YourTable table (ID int,AddressType varchar(25),Address1 varchar(50),Address2 varchar(50),CompanyID int)
Insert Into @YourTable values
(1,'Home' ,'25 Street','City 1',1),
(2,'Office','10 Avenue','City 2',1)
Declare @XML xml = (Select * from @YourTable for XML RAW) --<<< Initial Query
;with cteBase as (
Select ID = R.value('@CompanyID','int') --<<< Key ID
,AddressType = R.value('@AddressType','varchar(50)')
,Item = R.value('@AddressType','varchar(50)')+Attr.value('local-name(.)','varchar(100)')
,Value = Attr.value('.','varchar(max)')
From @XML.nodes('/row') as A(R)
Cross Apply A.r.nodes('./@*[local-name(.)!="CompanyID"]') as B(Attr) --<<< Key ID
),cteDist as (Select Distinct ID,Item from cteBase
),cteComp as (
Select A.*,B.Value
From cteDist A
Cross Apply (Select Value=Stuff((Select Distinct ',' + Value
From cteBase
Where ID=A.ID
and Item=A.Item
For XML Path ('')),1,1,'')) B
)
Select *
From (Select * From cteComp) as s
Pivot (max(value)
For Item in (HomeID,HomeAddressType,HomeAddress1,HomeAddress2,OfficeID,OfficeAddressType,OfficeAddress1,OfficeAddress2)) as pvt
戻り
に、最終的なピボットでID HomeID HomeAddressType HomeAddress1 HomeAddress2 OfficeID OfficeAddressType OfficeAddress1 OfficeAddress2
1 1 Home 25 Street City 1 2 Office 10 Avenue City 2
私はあなたの例では、内部を示していると思います結合が外部結合である必要があると言ったときの結合(デフォルト)... – Zack
LEFT JOINはOUTER JOINです –