使用 XML PATH 模式将兄弟姐妹分配到其右侧 parents

Assign the siblings to its right parents by using XML PATH mode

我正在使用 PATH 模式在 SQL 服务器中生成 XML 文件,但无法将兄弟姐妹分配到其右侧 parents。

这是我的可重现示例:

CREATE TABLE Conference(
ID CHAR(1),
ConferenceTitle CHAR(20),
Host CHAR(20)
)

INSERT INTO Conference
VALUES
('1','Fruit','Amy')


CREATE TABLE Presentation(
ConferenceID CHAR(1),
ID CHAR(1),
PresentationTitle CHAR(20),
Author CHAR(20)
)

INSERT INTO Presentation
VALUES
('1','1','apple','a1'),
('1','2','banana','a2'),
('1','3','carrot','a3'),
('1','4','durian','a4')


CREATE TABLE PresentationImage(
PresentationID CHAR(1),
ImageID CHAR(1),
ImageDescription CHAR(20)
)

INSERT INTO PresentationImage
VALUES
('1','1','apple1'),
('1','2','apple2'),
('2','1','banana1'),
('3','1','carrot1'),
('3','2','carrot2'),
('3','3','carrot3'),
('4','1','durian1'),
('4','2','durian2')

下面是我试过的类似代码:

SELECT p.ID AS "@ID", c.ConferenceTitle as 'ConTitle', p.PresentationTitle as 'PresTitle', 
       p.Author as 'Author',
    (SELECT pi.ImageID AS "@imgID", CAST(pi.ImageDescription AS nvarchar(max)) AS 'ImageData'
    FROM PresentationImage as pi
    INNER JOIN Presentation AS p ON pi.PresentationID = p.ID
    FOR  XML PATH ('Image'),
    ROOT ('Images'), TYPE)
FROM Conference c
INNER join Presentation as p ON  c.ID = p.ConferenceID
FOR XML PATH ('Presentation'),
ROOT ('Conference')

我得到的结果是:

<Conference>
<Presentation ID="1">
<ConTitle>Fruit               </ConTitle>
<PresTitle>apple               </PresTitle>
<Author>a1                  </Author>
<Images>
<Image imgID="1"><ImageData>apple1              </ImageData></Image>
<Image imgID="2"><ImageData>apple2              </ImageData></Image>
<Image imgID="1"><ImageData>banana1             </ImageData></Image>
<Image imgID="1"><ImageData>carrot1             </ImageData></Image>
<Image imgID="2"><ImageData>carrot2             </ImageData></Image>
<Image imgID="3"><ImageData>carrot3             </ImageData></Image>
<Image imgID="1"><ImageData>durian1             </ImageData></Image>
<Image imgID="2"><ImageData>durian2             </ImageData></Image>
</Images>
</Presentation>

<Presentation ID="2">
<ConTitle>Fruit               </ConTitle>
<PresTitle>banana              </PresTitle>
<Author>a2                  </Author>
<Images>
<Image imgID="1"><ImageData>apple1              </ImageData></Image>
<Image imgID="2"><ImageData>apple2              </ImageData></Image>
<Image imgID="1"><ImageData>banana1             </ImageData></Image>
<Image imgID="1"><ImageData>carrot1             </ImageData></Image>
<Image imgID="2"><ImageData>carrot2             </ImageData></Image>
<Image imgID="3"><ImageData>carrot3             </ImageData></Image>
<Image imgID="1"><ImageData>durian1             </ImageData></Image>
<Image imgID="2"><ImageData>durian2             </ImageData></Image>
</Images>
</Presentation>

<Presentation ID="3">
<ConTitle>Fruit               </ConTitle>
<PresTitle>carrot              </PresTitle>
<Author>a3                  </Author>
<Images>
<Image imgID="1"><ImageData>apple1              </ImageData></Image>
<Image imgID="2"><ImageData>apple2              </ImageData></Image>
<Image imgID="1"><ImageData>banana1             </ImageData></Image>
<Image imgID="1"><ImageData>carrot1             </ImageData></Image>
<Image imgID="2"><ImageData>carrot2             </ImageData></Image>
<Image imgID="3"><ImageData>carrot3             </ImageData></Image>
<Image imgID="1"><ImageData>durian1             </ImageData></Image>
<Image imgID="2"><ImageData>durian2             </ImageData></Image>
</Images>
</Presentation>

<Presentation ID="4">
<ConTitle>Fruit               </ConTitle>
<PresTitle>durian              </PresTitle>
<Author>a4                  </Author>
<Images>
<Image imgID="1"><ImageData>apple1              </ImageData></Image>
<Image imgID="2"><ImageData>apple2              </ImageData></Image>
<Image imgID="1"><ImageData>banana1             </ImageData></Image>
<Image imgID="1"><ImageData>carrot1             </ImageData></Image>
<Image imgID="2"><ImageData>carrot2             </ImageData></Image>
<Image imgID="3"><ImageData>carrot3             </ImageData></Image>
<Image imgID="1"><ImageData>durian1             </ImageData></Image>
<Image imgID="2"><ImageData>durian2             </ImageData></Image>
</Images>
</Presentation>

</Conference>

我试图实现的是每个图像都正确分配给其相应的演示文稿,如下所示:

<Conference>
<Presentation ID="1">
<ConTitle>Fruit               </ConTitle>
<PresTitle>apple               </PresTitle>
<Author>a1                  </Author>
<Images>
<Image imgID="1"><ImageData>apple1              </ImageData></Image>
<Image imgID="2"><ImageData>apple2              </ImageData></Image>
</Images>
</Presentation>

<Presentation ID="2">
<ConTitle>Fruit               </ConTitle>
<PresTitle>banana              </PresTitle>
<Author>a2                  </Author>
<Images>
<Image imgID="1"><ImageData>banana1             </ImageData></Image>
</Images>
</Presentation>

<Presentation ID="3">
<ConTitle>Fruit               </ConTitle>
<PresTitle>carrot              </PresTitle>
<Author>a3                  </Author>
<Images>
<Image imgID="1"><ImageData>carrot1             </ImageData></Image>
<Image imgID="2"><ImageData>carrot2             </ImageData></Image>
<Image imgID="3"><ImageData>carrot3             </ImageData></Image>
</Images>
</Presentation>

<Presentation ID="4">
<ConTitle>Fruit               </ConTitle>
<PresTitle>durian              </PresTitle>
<Author>a4                  </Author>
<Images>
<Image imgID="1"><ImageData>durian1             </ImageData></Image>
<Image imgID="2"><ImageData>durian2             </ImageData></Image>
</Images>
</Presentation>

</Conference>

有人可以帮我解决这个问题吗?谢谢大家

不需要用 Presentation table 写另一个 inner join 因为它会从 PresentationImagePresentation table 就像你的情况一样。只需 correlate the subquery 为:

SELECT p.ID AS "@ID", c.ConferenceTitle as 'ConTitle', p.PresentationTitle as 'PresTitle', 
       p.Author as 'Author',
    (SELECT pi.ImageID AS "@imgID", CAST(pi.ImageDescription AS nvarchar(max)) AS 'ImageData'
    FROM PresentationImage as pi
    --INNER JOIN Presentation AS p ON pi.PresentationID = p.ID
    where pi.PresentationID = p.ID
    FOR  XML PATH ('Image'),
    ROOT ('Images'), TYPE)
FROM Conference c
INNER join Presentation as p ON  c.ID = p.ConferenceID
FOR XML PATH ('Presentation'),
ROOT ('Conference')