2011-03-23 2 views
0

Étant donné la requête ci-dessous, est-il possible d'avoir des éléments sous l'élément "Métadonnées" en tant qu'attributs de l'élément "Event", sans changer la clause where de la sous-requête (ie WHERE UniqueID = t1.UniqueID AND ID = MAX t1.ID))?Comment puis-je obtenir une sous-requête XML pour ajouter des attributs au parent?

 
DECLARE @Event  TABLE 
(
    UniqueID VARCHAR(3), 
    ID   INT, 
    Name  VARCHAR(25), 
    Latitude FLOAT, 
    Longitude FLOAT, 
    PRIMARY KEY(UniqueID, ID) 
); 
DECLARE @Vehicle1  TABLE 
(
    UniqueID VARCHAR(3), 
    ID   INT, 
    Column1 VARCHAR(25) 
); 
DECLARE @Vehicle2  TABLE 
(
    UniqueID VARCHAR(3), 
    ID   INT, 
    Column1 VARCHAR(25) 
); 

INSERT INTO @Event VALUES ('ABC', 1, 'LPR', 1.234, 2.345) 
INSERT INTO @Event VALUES ('ABC', 2, 'LPR', 2.234, 3.345) 
INSERT INTO @Event VALUES ('ABC', 3, 'LPR', 3.234, 4.345) 
INSERT INTO @Event VALUES ('ABC', 4, 'LPR', 4.234, 5.345) 

INSERT INTO @Event VALUES ('DEF', 1, 'LPR', 1.234, 2.345) 

INSERT INTO @Event VALUES ('GHI', 1, 'Manual Scan', 1.234, 2.345) 
INSERT INTO @Event VALUES ('GHI', 2, 'Manual Scan', 2.234, 3.345) 

INSERT INTO @Vehicle1 VALUES ('ABC', 1, 'Plate # 1') 
INSERT INTO @Vehicle1 VALUES ('ABC', 1, 'Plate # 2') 

INSERT INTO @Vehicle2 VALUES ('GHI', 1, 'Plate # 1') 
INSERT INTO @Vehicle2 VALUES ('GHI', 2, 'Plate # 2') 
INSERT INTO @Vehicle2 VALUES ('GHI', 3, 'Plate # 3') 

SELECT 
    UniqueID AS UniqueID, 

    (SELECT 
     ID, 
     Name, 
     Latitude, 
     Longitude 
    FROM @Event 
    WHERE UniqueID = t1.UniqueID AND ID = MAX(t1.ID) 
    FOR XML RAW ('Metadata'), ELEMENTS, TYPE), 

    (SELECT 
     Column1 
    FROM @Vehicle1 
    WHERE UniqueID = t1.UniqueID 
    FOR XML RAW ('Row'), TYPE, ROOT ('Vehicle1')), 

    (SELECT 
     Column1 
    FROM @Vehicle2 
    WHERE UniqueID = t1.UniqueID 
    FOR XML RAW ('Row'), TYPE, ROOT ('Vehicle2')) 

FROM @Event t1 
GROUP BY t1.UniqueID 
FOR XML RAW ('Event'), TYPE, ROOT ('Events') 


+1

Ajouter le langage de programmation aux étiquettes ... – PhiLho

Répondre

1

Essayez ceci:

SELECT 
    UniqueID  AS [@UniqueID], 

    x.ID   AS [@ID], 
    x.Name   AS [@Name], 
    x.Latitude  AS [@Latitude], 
    x.Longitude  AS [@Longitude], 

    (SELECT 
     Column1 
    FROM @Vehicle1 
    WHERE UniqueID = t1.UniqueID 
    FOR XML RAW ('Row'), TYPE, ROOT ('Vehicle1')), 

    (SELECT 
     Column1 
    FROM @Vehicle2 
    WHERE UniqueID = t1.UniqueID 
    FOR XML RAW ('Row'), TYPE, ROOT ('Vehicle2')) 

FROM 
(
    SELECT 
     UniqueID, 
     MAX(t1.ID) AS MaxID 
    FROM 
     @Event AS t1 
    GROUP BY 
     t1.UniqueID 
) AS t1 
CROSS APPLY 
    (
     SELECT 
      ID, 
      Name, 
      Latitude, 
      Longitude 
     FROM 
      @Event 
     WHERE 
      UniqueID = t1.UniqueID AND 
      ID = t1.MaxID 
    ) AS x 
ORDER BY 
    T1.UniqueID  
FOR XML PATH('Event'), TYPE, ROOT ('Events'); 
Questions connexes