合并两个表并在 SQL 服务器中转换 XML

Union two tables and convert XML in SQL Server

我有两个包含 Type1 和 Type2 产品信息的 table 和一个包含费率信息的普通 table。

考虑以下 table 结构

Table #1 Type1Product:

Id        Name               TAX    Model    Class
___________________________________________________
GUID 1    Type1_Product_1    5      SUX      XI
GUID 2    Type1_Product_2    5      SUX      XII
GUID 3    Type1_Product_3    5      SUX      X
GUID 4    Type1_Product_4    5      SUX      XIII

Table #2 Type2Product:

Id        Name               TAX    Catalog
___________________________________________________
GUID 5    Type2_Product_1    5      IXM
GUID 6    Type2_Product_2    5      IXM
GUID 7    Type2_Product_3    5      IXM
GUID 8    Type2_Product_4    5      IXM

Table #3 Rate:

Id         ProductId          Rate
___________________________________________________
GUID 11    GUID 1             15
GUID 12    GUID 2             25
GUID 13    GUID 3             33
GUID 14    GUID 4             11
GUID 15    GUID 5             5
GUID 16    GUID 6             8
GUID 17    GUID 7             2
GUID 18    GUID 8             4

现在我有以下 SQL SELECT 使用 UNION

的查询
SELECT 
    t1.Id, t1.Name, rt.Rate 
FROM 
    Rate rt 
INNER JOIN 
    Type1Product t1 ON t1.Id = rt.ProductId

UNION

SELECT 
    t2.Id, t2.Name, rt.Rate 
FROM 
    Rate rt 
INNER JOIN 
    Type2Product t2 ON t2.Id = rt.ProductId
FOR XML PATH ('Product'), ELEMENTS, root ('Root')

注意:GUID是一个unique identifier "GUID 1"代表一个unique Identifier,为了方便理解我用了关键字like "GUID 1"

我在执行时遇到错误

Incorrect syntax near the keyword 'FOR'.

请帮助我。

使用下面的代码

with tamp as (

        SELECT 
            t1.Id, t1.Name, rt.Rate 
        FROM 
            Rate rt 
        INNER JOIN 
            Type1Product t1 ON t1.Id = rt.ProductId

        UNION

        SELECT 
            t2.Id, t2.Name, rt.Rate 
        FROM 
            Rate rt 
        INNER JOIN 
            Type2Product t2 ON t2.Id = rt.ProductId
    )

    select * from temp  FOR XML PATH ('Product'), ELEMENTS, root ('Root')

您必须像这样

将 Union 语句包装在单个 SELECT 语句中
SELECT(
SELECT * 
FROM(
SELECT 
    t1.Id, t1.Name, rt.Rate 
FROM 
    Rate rt 
INNER JOIN 
    Type1Product t1 ON t1.Id = rt.ProductId

UNION

SELECT 
    t2.Id, t2.Name, rt.Rate 
FROM 
    Rate rt 
INNER JOIN 
    Type2Product t2 ON t2.Id = rt.ProductId

) D
FOR XML PATH ('Product'), ELEMENTS, root ('Root')
) AS XMLout