XQUERY -SQL 检索 child 和 parent ID 的列表
XQUERY -SQL Retrieve list of child and parent ID
如何查询 xml 以获得以下结果?我对使用 XQuery 完全陌生。
XML样本:
<dec>
<asi idAsig="1">
<asiA A_1="1" A_2="0" A_3="N" A_4="8" A_5="1589" A_6="160"/>
<asiE1 E1_1="2569" E1_2="2569" E1_3="0" E1_4="0" E1_5="0"/>
</asi>
<asi idAsig="2" >
<asiA A_1="1" A_2="0" A_3="N" A_4="8" A_5="7175" A_6="160"/>
<asiB1 B1_1="1" B1_2="0" B1_3="N" B1_4="8" B1_5="4848"/>
<asiB1 B1_1="52" B1_2="0" B1_3="N" B1_4="8" B1_5="625"/>
<asiE1 E1_1="7175" E1_2="2512" E1_3="0" E1_4="0" E1_5="0"/>
</asi>
<asi idAsig="3" >
<asiA A_1="3" A_2="3" A_3="Y" A_4="10" A_5="585" A_6="160"/>
<asiB1 B1_1="1" B1_2="0" B1_3="N" B1_4="8" B1_5="589"/>
<asiB1 B1_1="39" B1_2="0" B1_3="N" B1_4="8" B1_5="15647"/>
<asiE1 E1_1="7175" E1_2="2512" E1_3="0" E1_4="0" E1_5="0"/>
</asi>
</dec>
结果:
idAsig
B1_1
B1_2
B1_3
B1_4
B1_5
1
NULL
NULL
NULL
NULL
NULL
2
1
0
N
8
4848
2
52
0
N
8
625
3
1
0
N
8
589
3
39
0
N
8
15647
我试试这个查询
SELECT
[idAsig] = Y.A.value('(@idAsig)[1]', 'INT')
,[B1_1] = Y.A.value('(@B1_1)[1]', 'int')
,[B1_2] = e.XMLData.value('(/*:dec/*:asi/*:asiB1/@B1_2)[1]', 'int')
,[B1_3] = Y.A.value('(@B1_3)[1]', 'NVARCHAR(MAX)')
,[B1_4] = Y.A.value('(@B1_4)[1]', 'int')
,[B1_5] = Y.A.value('(@B1_5)[1]', 'int')
FROM #tmp_XmlData AS e
--OUTER APPLY e.XMLData.nodes('/*:dec/*:asi') AS X(A)
CROSS APPLY e.XMLData.nodes('/*:dec/*:asi/*:asiB1') AS Y(A)
您可以在 e.XMLData.nodes('/*:dec/*:asi') AS X(A)
上使用 CROSS APPLY
,然后在 X.A.nodes('*:asiB1')
上使用 OUTER APPLY
,因为您希望所有 asi
元素都出现在查询结果中,而不管它是否有child asiB1
:
SELECT
[idAsig] = X.A.value('(@idAsig)[1]', 'INT')
,[B1_1] = Y.A.value('(@B1_1)[1]', 'int')
,[B1_2] = e.XMLData.value('(/*:dec/*:asi/*:asiB1/@B1_2)[1]', 'int')
,[B1_3] = Y.A.value('(@B1_3)[1]', 'NVARCHAR(MAX)')
,[B1_4] = Y.A.value('(@B1_4)[1]', 'int')
,[B1_5] = Y.A.value('(@B1_5)[1]', 'int')
FROM tmp_XmlData AS e
CROSS APPLY e.XMLData.nodes('/*:dec/*:asi') AS X(A)
OUTER APPLY X.A.nodes('*:asiB1') AS Y(A)
如何查询 xml 以获得以下结果?我对使用 XQuery 完全陌生。
XML样本:
<dec>
<asi idAsig="1">
<asiA A_1="1" A_2="0" A_3="N" A_4="8" A_5="1589" A_6="160"/>
<asiE1 E1_1="2569" E1_2="2569" E1_3="0" E1_4="0" E1_5="0"/>
</asi>
<asi idAsig="2" >
<asiA A_1="1" A_2="0" A_3="N" A_4="8" A_5="7175" A_6="160"/>
<asiB1 B1_1="1" B1_2="0" B1_3="N" B1_4="8" B1_5="4848"/>
<asiB1 B1_1="52" B1_2="0" B1_3="N" B1_4="8" B1_5="625"/>
<asiE1 E1_1="7175" E1_2="2512" E1_3="0" E1_4="0" E1_5="0"/>
</asi>
<asi idAsig="3" >
<asiA A_1="3" A_2="3" A_3="Y" A_4="10" A_5="585" A_6="160"/>
<asiB1 B1_1="1" B1_2="0" B1_3="N" B1_4="8" B1_5="589"/>
<asiB1 B1_1="39" B1_2="0" B1_3="N" B1_4="8" B1_5="15647"/>
<asiE1 E1_1="7175" E1_2="2512" E1_3="0" E1_4="0" E1_5="0"/>
</asi>
</dec>
结果:
idAsig | B1_1 | B1_2 | B1_3 | B1_4 | B1_5 |
---|---|---|---|---|---|
1 | NULL | NULL | NULL | NULL | NULL |
2 | 1 | 0 | N | 8 | 4848 |
2 | 52 | 0 | N | 8 | 625 |
3 | 1 | 0 | N | 8 | 589 |
3 | 39 | 0 | N | 8 | 15647 |
我试试这个查询
SELECT
[idAsig] = Y.A.value('(@idAsig)[1]', 'INT')
,[B1_1] = Y.A.value('(@B1_1)[1]', 'int')
,[B1_2] = e.XMLData.value('(/*:dec/*:asi/*:asiB1/@B1_2)[1]', 'int')
,[B1_3] = Y.A.value('(@B1_3)[1]', 'NVARCHAR(MAX)')
,[B1_4] = Y.A.value('(@B1_4)[1]', 'int')
,[B1_5] = Y.A.value('(@B1_5)[1]', 'int')
FROM #tmp_XmlData AS e
--OUTER APPLY e.XMLData.nodes('/*:dec/*:asi') AS X(A)
CROSS APPLY e.XMLData.nodes('/*:dec/*:asi/*:asiB1') AS Y(A)
您可以在 e.XMLData.nodes('/*:dec/*:asi') AS X(A)
上使用 CROSS APPLY
,然后在 X.A.nodes('*:asiB1')
上使用 OUTER APPLY
,因为您希望所有 asi
元素都出现在查询结果中,而不管它是否有child asiB1
:
SELECT
[idAsig] = X.A.value('(@idAsig)[1]', 'INT')
,[B1_1] = Y.A.value('(@B1_1)[1]', 'int')
,[B1_2] = e.XMLData.value('(/*:dec/*:asi/*:asiB1/@B1_2)[1]', 'int')
,[B1_3] = Y.A.value('(@B1_3)[1]', 'NVARCHAR(MAX)')
,[B1_4] = Y.A.value('(@B1_4)[1]', 'int')
,[B1_5] = Y.A.value('(@B1_5)[1]', 'int')
FROM tmp_XmlData AS e
CROSS APPLY e.XMLData.nodes('/*:dec/*:asi') AS X(A)
OUTER APPLY X.A.nodes('*:asiB1') AS Y(A)