使用 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
因为它会从 PresentationImage
和 Presentation
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')
我正在使用 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
因为它会从 PresentationImage
和 Presentation
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')