2016-04-10 8 views
2

XMLフィールドを含むORDERSテーブルからSELECTクエリを処理しています。他のデータの中には、XMLフィールドにはオーダー明細が含まれています。私はこれが最高のデザインではないことを知っていますが、私はそれに固執する必要があります。 すべてのオーダー明細を選択する必要があります。複数のレコードとしてのXMLフィールドからのSQL SELECT

これは私の各注文の最初の行の項目を取得:

SELECT 
OrderNumber, 
[OrderItems].value('(/items/item/sku/node())[1]', 'varchar(20)') AS SKU 
FROM Orders 
WHERE OrderDate = '2016-04-09' 

すべての請求書のすべてのラインアイテムを取得する方法はありますか?

+2

私は@ har07は、私はいつも同じサンプルデータが含まれるように、あなたをお勧めする正しい考えを持っていると思いますが、期待される出力。実際のXMLがなければ、答えは魔法の球で読んでいます... – Shnugo

+0

@ Shnugo、ありがとう、私はこれから行うでしょう。そしてはい、har07の答えは正しかった、それは期待どおりに働いた。 –

答えて

2

APPLYnodes()を使用すると、XMLデータを複数のレコードに細断することができます。たとえば、あなたが<sku>要素レベルでXMLを細断処理す​​ると仮定して、あなたは以下の通り行うことができます。

SELECT 
    OrderNumber, 
    SkuColumn.value('.', 'varchar(20)') AS SKU 
FROM Orders 
    CROSS APPLY OrderItems.nodes('/items/item/sku') SkuTable(SkuColumn) 
WHERE OrderDate = '2016-04-09' 
+0

チャームとして働いた。ありがとうございました! –

+0

上記のクエリを変更して、同じテーブルからSKUと共にProductNameを取得できるように助けてください。私は本当にここで構文に苦しんでいます。 –

+1

気にしないで、私はそれを得た。あなたの助けをもう一度ありがとう! SELECT ORDERNUMBER、 ItemColumn.value( 'SKU [1]'、 'VARCHAR(20)')[商品 AS SKU、 ItemColumn.value AS( '商品名[1]'、 'VARCHAR(20)')注文から CROSSが適用されますOrderItems.nodes( '/ items/item')ItemTable(ItemColumn) WHERE OrderDate = '2016-04-09' –

関連する問題