Для SQL Server 2005/2008 вы должны сделать что-то вроде:
SELECT
contractID as [@contractid],
ContractName as [@contractname],
ContractType As [@contracttype],
( SELECT
subcontractid as [@subcontractid],
ContractName as [@contractname],
ContractType As [@contracttype]
FROM Table1 AS inner
WHERE outer.contractID=inner.contractID AND
subcontractid IS NOT NULL FOR XML PATH('subcontract'), TYPE ) as [node()]
WHERE subcontractid IS NULL
FOR XML PATH('contract'), ROOT('contracts')
Для Oracle: что-то вроде:
SELECT XMLELEMENT('contracts',
(SELECT XMLELMENT('contract',
XMLAgg(
XMLAttributes(
contractID as 'contractid',
ContractName as 'contractname',
ContractType as 'contracttype'),
(SELECT XMLElement('subcontract',
XMLAgg(
XMLAttributes(
subcontractid as 'subcontractid',
ContractName as 'contractname',
ContractType as 'contracttype'
)
)
FROM Table1 AS inner
WHERE inner.contractID=outer.contractID AND subcontractid IS NOT NULL
)
)
)
FROM Table1 AS outer WHERE subcontractid IS NULL
)
)