0

次のような XML 列 (MetaData と呼ばれる) を持つテーブルがあります。

<props>
  <prop name="bytes" value="194" />
  <prop name="error" value="File is a text file" />
  <prop name="mime-type" value="text/plain " />
</props>

ここで、これで選択できるいくつかの異なるエラーがあります。

SELECT MetaData.value('(/props/prop[@name="error"]/@value)[1]', 'varchar(50)') Error,
       MetaData.value('(/props/prop[@name="mime-type"]/@value)[1]', 'varchar(50)') MimeType,
       *
FROM source
WHERE MetaData.exist('/props/prop[@name="error"]') = 1

ここで、エラーが発生する頻度を数えたいと思います。

SELECT MetaData.value('(/props/prop[@name="error"]/@value)[1]', 'varchar(50)') Error,
       COUNT(*) Count
FROM source
WHERE MetaData.exist('/props/prop[@name="error"]') = 1
GROUP BY Error

しかし、エラーメッセージが表示されます:

Meldung 207、Ebene 16、Status 1、Zeile 5
Ungültiger Spaltenname 'Error'.

これは次のような意味です: 無効な列名 'エラー'

ここでもこれを試しました:

Select Error, COUNT(Error) FROM (
    SELECT MetaData.value('(/props/prop[@name="error"]/@value)[1]', 'varchar(50)') Error
    FROM videos
    WHERE MetaData.exist('/props/prop[@name="error"]') = 1
)
GROUP BY Error

しかし、それは次のようにクラッシュします:

Meldung 156、Ebene 15、Status 1、Zeile 6
Falsche Syntax in der Nähe des GROUP-Schlüsselworts.

これは次のような意味です: キーワード GROUP 付近の構文エラー

どうすればその問題を解決できますか?

4

3 に答える 3

3

同じクエリでエイリアス化された列を参照できるのは、ORDER BY 句内だけです。最後の試行でのエラーは、サブクエリにテーブル エイリアスを指定する必要があることでした。より適切な名前がないため、以下で「X」を使用しました。

SELECT Error, COUNT(Error) [Count]
FROM (
    SELECT MetaData.value('(/props/prop[@name="error"]/@value)[1]', 'varchar(50)') Error
    FROM source
    WHERE MetaData.exist('/props/prop[@name="error"]') = 1
) X
GROUP BY Error

AndCountは予約語なので、使用する場合は角括弧で囲む必要があります。

于 2012-09-26T10:43:28.303 に答える
2

2 番目のクエリでは、サブクエリに名前を付ける必要があります

Select Error, COUNT(Error) FROM
( 
    SELECT MetaData.value('(/props/prop[@name="error"]/@value)[1]', 'varchar(50)') Error 
    FROM videos 
    WHERE MetaData.exist('/props/prop[@name="error"]') = 1 
) subqueryname
GROUP BY Error 

好きな名前を付けることができます。

于 2012-09-26T10:44:51.050 に答える
0

正しい。次のようにすることもできます。

SELECT error, COUNT(*) errorCount
FROM
    (
    SELECT
        e.c.value ('@value', 'varchar(50)') Error
    FROM source s
        CROSS APPLY s.metadata.nodes('props/prop[@name="error"]') e(c) 
    ) x
GROUP BY error

XQuery を使用してこれを行うこともできますが、期待される結果がどのように表示されるかは明確ではありません。これを試して:

DECLARE @source TABLE ( metadata XML )

INSERT INTO @source
SELECT '<props> 
  <prop name="bytes" value="194" /> 
  <prop name="error" value="File is a text file" /> 
  <prop name="mime-type" value="text/plain " /> 
</props>'

INSERT INTO @source
SELECT '<props> 
  <prop name="bytes" value="0" /> 
  <prop name="error" value="error 1" /> 
  <prop name="error" value="error 2" /> 
  <prop name="mime-type" value="text/plain " /> 
</props>'

SELECT
    MetaData.value('(/props/prop[@name="error"]/@value)[1]', 'varchar(50)') Error, 
    MetaData.value('(/props/prop[@name="mime-type"]/@value)[1]', 'varchar(50)') MimeType, 
    MetaData.value('count(/props/prop[@name="error"])', 'int') errorCount, 
    * 
FROM @source 
WHERE MetaData.exist('/props/prop[@name="error"]') = 1
于 2012-09-26T12:35:10.500 に答える