如何将两个FOR XML AUTO合并为1个XML?

How to combine two FOR XML AUTO into 1 XML?

我们正在使用 SQL Server 2012。

下面的查询将 2 FOR XML AUTO 合并为 1 XML,但问题是 ID、SystemSource、Manager 包含在元素 TradeTicket 中而不是它们自己,而 accountManager、unitPrice 是包含在元素 allocationRow 中而不是单独存在。

谢谢

        SELECT '<?xml version="1.0"?>'+
    (SELECT 
            (   SELECT trTicket.[id],trTicket.[manager],'PFM' as SystemSource
                    ,allocationRow.accountNumber,allocationRow.unitPrice
                FROM myTbl AS trTicket 
                LEFT JOIN myAllocation AS allocationRow ON allocationRow.trade_ticket_id=trTicket.id
                    WHERE trTicket.ID = 8779631
                    ORDER BY trTicket.id,allocationRow.AccountNumber
                FOR XML AUTO, type)
            ,
            (
                SELECT trTicket.[id],trTicket.[manager],'CRD' as SystemSource
                    ,allocationRow.accountNumber,allocationRow.unitPrice
                FROM ABC_myTbl AS trTicket 
                LEFT JOIN ABC_myAllocation AS allocationRow ON allocationRow.trade_ticket_id=trTicket.id
                    WHERE trTicket.ID = 8
                    ORDER BY trTicket.id,allocationRow.AccountNumber
                FOR XML AUTO, type)
    FOR XML PATH('trTickets'), ELEMENTS) AS XMLResult

这是当前结果:

<?xml version="1.0"?>
<trTickets>
<trTicket id="8779631" SystemSource="PFM" manager="MCM">
<allocationRow accountNumber="292 " unit_Price="300"/>
</trTicket>
<trTicket id="8" SystemSource="CRD" manager="DOYLE">
<allocationRow unitPrice="100" accountNumber="F11 "/>
<allocationRow unitPrice="200" accountNumber="F22 "/>
</trTicket>
</trTickets>

这是我想要的结果:

    <?xml version="1.0"?>
    <trTickets>
    <trTicket>
    <id>8</id>
    <manager>DOYLE</manager>
    <SystemSource>CRD</SystemSource>
    <allocationRow>
    <accountNumber>F11</accountNumber>
    <unitPrice>100</unitPrice>
    </allocationRow>
    <allocationRow>
    <accountNumber>F22</accountNumber>
    <unitPrice>200</unitPrice>
    </allocationRow>
    </trTicket>
    <trTicket>
    <id>8779631</id>
    <manager>MCM</manager> 
    <SystemSource>PFM</SystemSource>
    <allocationRow>
    <accountNumber>292</accountNumber>
    <unitPrice>300</unitPrice>
    </allocationRow>
    </trTicket>
    </trTickets>

数据样本:

Table ABC_myTbl:

ID  Manager
-----------
8   DOYLE

Table ABC_myAllocation:

accountNumber   unitPrice
-------------------------
F11             100
F22             200

Table myTbl:

ID      Manager
--------------- 
8779631 MCM

Table myAllocation:

accountNumber   unitPrice
--------------------------
292             300

table 及其数据的 DDL:

CREATE TABLE dbo.ABC_myTbl 
(
    ID INT  NOT NULL,
    MANAGER VARCHAR(10) NOT NULL
)

CREATE TABLE dbo.myTbl 
(
    ID INT  NOT NULL,
    MANAGER VARCHAR(10) NOT NULL
)   

CREATE TABLE dbo.ABC_myAllocation
(
    accountNumber VARCHAR(10) NOT NULL,
    unitprice     NUMERIC(10, 3) NOT NULL
)

CREATE TABLE dbo.myAllocation
(
    accountNumber VARCHAR(10) NOT NULL,
    unitprice     NUMERIC(10, 3)  NOT NULL
)

INSERT INTO dbo.ABC_myTbl VALUES (8,'DOYLE')

INSERT INTO dbo.ABC_myAllocation VALUES ('F11',100)
INSERT INTO dbo.ABC_myAllocation VALUES ('F22',200)

INSERT INTO dbo.myTbl VALUES (8779631,'MCM')

INSERT INTO dbo.myAllocation  VALUES  ('292',300)

我没有等到您的 DDL 和示例数据填充。因此,我为您创建了一个概念示例。请注意,这些表具有隐含关系,它们在 WHERE 子句中使用。

SQL

-- DDL and sample data population, start
DECLARE @tbl1 TABLE (ID INT PRIMARY KEY, Manager VARCHAR(20));
INSERT INTO @tbl1 (ID, Manager) VALUES
(8, 'DOYLE'),
(9, 'XYZ');

DECLARE @tbl1Child TABLE (accountNumber CHAR(3) PRIMARY KEY, ParentID INT, unitPrice DECIMAL(10,2));
INSERT INTO @tbl1Child (accountNumber, ParentID, unitPrice) VALUES
('F11', 8, 100)
,('F22', 8, 200)
,('F70', 9, 770);

DECLARE @tbl2 TABLE (ID INT PRIMARY KEY, Manager VARCHAR(20));
INSERT INTO @tbl2 (ID, Manager) VALUES
(8779631, 'MCM')
,(8779555, 'TTT');

DECLARE @tbl2Child TABLE (accountNumber CHAR(3) PRIMARY KEY, ParentID INT, unitPrice DECIMAL(10,2));
INSERT INTO @tbl2Child (accountNumber, ParentID, unitPrice) VALUES
('292', 8779631, 300)
,('255', 8779555, 500);
-- DDL and sample data population, end

SELECT TOP(1) NULL
, (
    SELECT *
        , (
            SELECT * FROM @tbl1Child AS c
            WHERE p.ID = c.ParentID
            FOR XML PATH('allocation_row'), TYPE
        ) 
    FROM @tbl1 AS p
    FOR XML PATH('tradeTicket'), TYPE
)
, (
    SELECT *
        , (
            SELECT * FROM @tbl2Child AS c
            WHERE p.ID = c.ParentID
            FOR XML PATH('allocation_row'), TYPE
    ) 
    FROM @tbl2 AS p
    FOR XML PATH('tradeTicket'), TYPE
)
FROM @tbl1
FOR XML PATH(''), TYPE, ROOT('tradeTickets');

Output

<tradeTickets>
  <tradeTicket>
    <ID>8</ID>
    <Manager>DOYLE</Manager>
    <allocation_row>
      <accountNumber>F11</accountNumber>
      <ParentID>8</ParentID>
      <unitPrice>100.00</unitPrice>
    </allocation_row>
    <allocation_row>
      <accountNumber>F22</accountNumber>
      <ParentID>8</ParentID>
      <unitPrice>200.00</unitPrice>
    </allocation_row>
  </tradeTicket>
  <tradeTicket>
    <ID>9</ID>
    <Manager>XYZ</Manager>
    <allocation_row>
      <accountNumber>F70</accountNumber>
      <ParentID>9</ParentID>
      <unitPrice>770.00</unitPrice>
    </allocation_row>
  </tradeTicket>
  <tradeTicket>
    <ID>8779555</ID>
    <Manager>TTT</Manager>
    <allocation_row>
      <accountNumber>255</accountNumber>
      <ParentID>8779555</ParentID>
      <unitPrice>500.00</unitPrice>
    </allocation_row>
  </tradeTicket>
  <tradeTicket>
    <ID>8779631</ID>
    <Manager>MCM</Manager>
    <allocation_row>
      <accountNumber>292</accountNumber>
      <ParentID>8779631</ParentID>
      <unitPrice>300.00</unitPrice>
    </allocation_row>
  </tradeTicket>
</tradeTickets>