我想将多个表中的数据存储到一个表中
table A (
p, q,
PRIMARY KEY (p,q)
)
table B (
p, m, n,
PRIMARY KEY (p,m,n)
)
table output(
p,
xml
)
输出应该像
表A
-------------------------------
| p | xml |
---------------------------------
|value of p | <q>some value</q> |
-------------------------------
表B
-----------------------------------------------
| p | xml |
------------------------------------------------
|value of p | <m>some value</m><n>some data</n> |
-----------------------------------------------
这可以通过此查询来实现
SELECT *
FROM Students s
CROSS APPLY
(
SELECT
(
SELECT *
FROM Students t
WHERE t.DisplayName = s.DisplayName
FOR XML RAW
) x1
)x
但我想让SQL足够通用,以便给定任何表名,我们可以得到上面的输出。
内部联接的问题是,查询将不是通用的
答案 0 :(得分:1)
要从一个表中获得您想要的结果,您可以使用以下内容:
select T.Table1ID,
(
select T.*
for xml raw, type
) as x1
from Table1 as T
要将相同的模式应用于另一个表,您需要更改表名和键列的字段名。
select T.Table2ID,
(
select T.*
for xml raw, type
) as x1
from Table2 as T
如果您想要更通用的版本,可以使用动态SQL并根据表名和列名构建查询。
declare @TableName sysname
declare @KeyColumnName sysname
set @TableName = 'master..spt_values'
set @KeyColumnName = 'Number'
declare @SQL nvarchar(500)
set @SQL = '
select '+@KeyColumnName+',
(
select T.*
for xml raw, type
) as x1
from '+@TableName+' as T'
exec (@SQL)
答案 1 :(得分:0)
对不起,如果我误解了,但这或多或少是你追求的原则吗?
;WITH Base AS
(
SELECT Cat = PC.Name
,SubCat = SC.Name
FROM Production.ProductCategory PC
JOIN Production.ProductSubcategory SC ON SC.ProductCategoryID = PC.ProductCategoryID
)
SELECT Cat, (SELECT SubCat FROM Base T2 WHERE T2.Cat = T1.Cat FOR XML AUTO )DT
FROM Base T1