Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 从SQL server中具有不同子xml标记的父xml获取数据_Sql Server_Xquery_Xquery Sql - Fatal编程技术网

Sql server 从SQL server中具有不同子xml标记的父xml获取数据

Sql server 从SQL server中具有不同子xml标记的父xml获取数据,sql-server,xquery,xquery-sql,Sql Server,Xquery,Xquery Sql,我有一个xml,它的父标记基于它的模型类型有不同的子标记。 我只想在一个Select查询中获得这些不同的子标记数据 下面是我的xml <rateModelList> <rateModel> <intRateModelID>1</intRateModelID> <strName>Gra - Base Model</strName> <

我有一个xml,它的父标记基于它的模型类型有不同的子标记。 我只想在一个Select查询中获得这些不同的子标记数据

下面是我的xml

<rateModelList>
        <rateModel>
            <intRateModelID>1</intRateModelID>
            <strName>Gra - Base Model</strName>
            <intModelTypeID>1</intModelTypeID>          
            <totalVolumeTiersList>
                <totalVolumeTiers>
                    <decIncentiveRate>0.50</decIncentiveRate>
                    <decMaxValue>19.00</decMaxValue>
                    <decMinValue>0.00</decMinValue>                                 
                </totalVolumeTiers>             
            </totalVolumeTiersList>
        </rateModel>
        <rateModel>
            <intRateModelID>2</intRateModelID>
            <strName>Ges - Special</strName>
            <intModelTypeID>3</intModelTypeID>          
            <participationTiersList>
                <participationTiers>
                    <decIncentiveRate>0.50</decIncentiveRate>
                    <decMaxValue>19.00</decMaxValue>
                    <decMinValue>0.00</decMinValue>                                 
                </participationTiers>               
            </participationTiersList>
            <dollarBasedTiersList>
                <dollarBasedTiers>
                    <decIncentiveRate>0.50</decIncentiveRate>
                    <decMaxValue>19.00</decMaxValue>
                    <decMinValue>0.00</decMinValue>                             
                </dollarBasedTiers>             
            </dollarBasedTiersList>
        </rateModel>
        <rateModel>
            <intRateModelID>5</intRateModelID>
            <strName>G2 - participation</strName>
            <intModelTypeID>2</intModelTypeID>          
            <participationTiersList>
                <participationTiers>
                    <decIncentiveRate>0.50</decIncentiveRate>
                    <decMaxValue>19.00</decMaxValue>
                    <decMinValue>0.00</decMinValue>                 
                </participationTiers>               
            </participationTiersList>
        </rateModel>
    </rateModelList>

您是否尝试使用外部应用而不是交叉应用

SELECT 
  t.c.value('(strName/text())[1]', 'varchar(500)') as strName
, t.c.value('(intModelTypeID/text())[1]', 'int') as intModelTypeID
, ( SELECT min(x) FROM ( VALUES (s.c.value('(decMinValue/text())[1]','decimal(17,4)')) , (r.c.value('(decMinValue/text())[1]','decimal(17,4)')) , (u.c.value('(decMinValue/text())[1]','decimal(17,4)')) ) AS val(x) ) as decMinValue
    FROM @planBean.nodes('rateModelList/rateModel') t(c)
    OUTER APPLY t.c.nodes('./totalVolumeTiersList/totalVolumeTiers') s(c)
    OUTER APPLY t.c.nodes('./participationTiersList/participationTiers') r(c)
    OUTER APPLY t.c.nodes('./dollarBasedTiersList/dollarBasedTiers') u(c)
否则,可以使用三个查询的并集:

SELECT strName, intModelTypeID, min(decMinValue) decMinValue
    FROM
    (
    SELECT 
          t.c.value('(strName/text())[1]', 'varchar(500)') as strName
        , t.c.value('(intModelTypeID/text())[1]', 'int') as intModelTypeID
        , u.c.value('(decMinValue/text())[1]', 'decimal(17,4)') as decMinValue
    FROM @planBean.nodes('rateModelList/rateModel') t(c)
    CROSS APPLY t.c.nodes('./dollarBasedTiersList/dollarBasedTiers') u(c)
    UNION
    SELECT 
          t.c.value('(strName/text())[1]', 'varchar(500)') as strName
        , t.c.value('(intModelTypeID/text())[1]', 'int') as intModelTypeID
        , r.c.value('(decMinValue/text())[1]', 'decimal(17,4)') as decMinValue
    FROM @planBean.nodes('rateModelList/rateModel') t(c)
    CROSS APPLY t.c.nodes('./participationTiersList/participationTiers') r(c)
    UNION
    SELECT 
          t.c.value('(strName/text())[1]', 'varchar(500)') as strName
        , t.c.value('(intModelTypeID/text())[1]', 'int') as intModelTypeID
        , s.c.value('(decMinValue/text())[1]', 'decimal(17,4)') as decMinValue
    FROM @planBean.nodes('rateModelList/rateModel') t(c)
    CROSS APPLY t.c.nodes('./totalVolumeTiersList/totalVolumeTiers') s(c)
    ) sbt
    GROUP BY strName, intModelTypeID

这两种解决方案只有在层数减少且已定义的情况下才可行。

您可以在XQuery中使用通配符来访问
decMinValue
元素,也可以在XQuery中进行聚合

select M.X.value('(strName/text())[1]', 'varchar(500)') as strName,
       M.X.value('(intModelTypeID/text())[1]', 'int') as intModelTypeID,
       M.X.value('min(*/*/decMinValue/text()) cast as xs:decimal?', 'decimal(17,4)') decMinValue
from @planBean.nodes('/rateModelList/rateModel') as M(X);

可以找到有关为什么强制转换为xs:decimal的解释。

是的,我认为Union对我有用,因为我需要在同一列中获取decMinValue的数据。此外,第一个解决方案可用于获取单个列。我修改了我的答案。
SELECT strName, intModelTypeID, min(decMinValue) decMinValue
    FROM
    (
    SELECT 
          t.c.value('(strName/text())[1]', 'varchar(500)') as strName
        , t.c.value('(intModelTypeID/text())[1]', 'int') as intModelTypeID
        , u.c.value('(decMinValue/text())[1]', 'decimal(17,4)') as decMinValue
    FROM @planBean.nodes('rateModelList/rateModel') t(c)
    CROSS APPLY t.c.nodes('./dollarBasedTiersList/dollarBasedTiers') u(c)
    UNION
    SELECT 
          t.c.value('(strName/text())[1]', 'varchar(500)') as strName
        , t.c.value('(intModelTypeID/text())[1]', 'int') as intModelTypeID
        , r.c.value('(decMinValue/text())[1]', 'decimal(17,4)') as decMinValue
    FROM @planBean.nodes('rateModelList/rateModel') t(c)
    CROSS APPLY t.c.nodes('./participationTiersList/participationTiers') r(c)
    UNION
    SELECT 
          t.c.value('(strName/text())[1]', 'varchar(500)') as strName
        , t.c.value('(intModelTypeID/text())[1]', 'int') as intModelTypeID
        , s.c.value('(decMinValue/text())[1]', 'decimal(17,4)') as decMinValue
    FROM @planBean.nodes('rateModelList/rateModel') t(c)
    CROSS APPLY t.c.nodes('./totalVolumeTiersList/totalVolumeTiers') s(c)
    ) sbt
    GROUP BY strName, intModelTypeID
select M.X.value('(strName/text())[1]', 'varchar(500)') as strName,
       M.X.value('(intModelTypeID/text())[1]', 'int') as intModelTypeID,
       M.X.value('min(*/*/decMinValue/text()) cast as xs:decimal?', 'decimal(17,4)') decMinValue
from @planBean.nodes('/rateModelList/rateModel') as M(X);