2

currentmember 関数を使用してメンバーでフィルター処理するクエリが 3 つあります。フィルターを適用するメンバーを含む階層にフィルターを適用すると、IS 演算子を使用してメンバーを照合し、正しい結果を得ることができます。ただし、フィルタリングされたセットとメンバーが異なる階層にある場合は機能しません。それでも、オブジェクト比較の代わりにキャプション比較を行うだけで、2 番目のケースでフィルタリングされた結果を正しく取得できます。例では、AdventureWorks データベースを使用します。

このクエリは、IS 演算子で期待どおりに機能します。

select non empty [Measures].[Reseller Sales Amount] on 0,
Filter (NonEmpty({[Geography].[Country].[Country].ALLMEMBERS * [Geography].[City].[City].ALLMEMBERS}), [Geography].[City].Currentmember IS [Geography].[City].&[Seattle]&[WA]) on 1

【アドベンチャーワークス】より

これはキャプションの比較を使用します (予想どおり、異なる結果)

select non empty [Measures].[Reseller Sales Amount] on 0,
Filter (NonEmpty({[Geography].[Country].[Country].ALLMEMBERS}), [Geography].[City].Currentmember.MEMBER_CAPTION = 'Seattle') on 1

【アドベンチャーワークス】より

ただし、これは前のクエリと同じ結果を生成するはずですが、何も返しません。

select non empty [Measures].[Reseller Sales Amount] on 0,
Filter (NonEmpty({[Geography].[Country].[Country].ALLMEMBERS }), [Geography].[City].Currentmember IS [Geography].[City].&[Seattle]&[WA]) on 1

【アドベンチャーワークス】より

ありがとう。

4

2 に答える 2

1

実際、これは少し奇妙です。私にとって、最も驚くべき結果は 2 番目の結果です。セット内に市区町村でフィルター処理される参照がありませんが、フィルターが適用されます。2番目の結果の理由は、どういうわけか「暗黙の上書き」が始まるためだと思います.

おそらく、2 番目と 3 番目のケースは、オプティマイザーがステートメントを解釈するために何らかの方法で異なる方法を選択するため、異なる方法で処理されます。IS通常、キャプションへの参照のような文字列操作は、オブジェクト ID で機能する演算子よりも効率的ではありません。

于 2013-08-27T12:18:21.930 に答える
0

ほとんどのコメントは、2 番目のクエリの結果がバグであることを確認しているようです。この別のスレッドにいくつかのコメントがあります

于 2013-08-28T17:49:37.653 に答える