2011-02-09 14 views
0

サブクエリ連結を行う次のSQL文があります。あなたが気づいたら、それはFOR XML ..を使用しています。うーん。私に震えを少し与えます::私はそれがいくつかのコード臭のように感じます。SQL Server 2008でこの連結を行うより良い方法はありますか?

SQL Server 2008でこれを行うより良い方法はありますか?

SELECT a.CityId AS LocationId, a.City, 
    STUFF(
     (SELECT ', ' + x.County 
     FROM [dbo].[CountiesView] x 
      INNER JOIN [dbo].[CityCounties] y ON x.CountyId = y.CountyId 
     WHERE y.CityId = a.CityId 
     FOR XML PATH ('')) 
    , 1, 2, '') 
FROM [dbo].[CitiesView] a 
    where a.StateCode = 'NY' 

このコードは、ニューヨーク州のすべての都市(およびその郡)をリストしています。 1つ以上の郡に都市が存在する可能性があるため、郡名をまとめることをお勧めします。そうでなければ、私は郡ごとに1つの都市列を取得します(私は望みません)。

これはリファクタリングできますか?

私はCOALESCEを使用しようとしましたが、運がありませんでした。

+0

関連性のあるサンプルのサンプル。 – vonPryz

+0

いいえ、**は**それを行う最善の方法です - コード臭いかどうか。 –

答えて

1

「ベター」の目にあります見る人。私はSQL Server 2005以降でこれを行うためのより良い方法を見たことはありませんが、私は懸命に見ていません。

最も良い方法はおそらくprogram your own aggregate functionです。私はむしろこのクエリを維持すると思います。

1

ORDERを気にしないので、これを行うにはCLRカスタム集計を使用できます。これはよくXML方式よりも良好に機能することができ、あなたの現在のアプローチは、どの郡が&記号が含まれている場合にも対処しない(または<>が、私はそれはそうですね!)

+0

ええ、私は今日(私がこの投稿をする前に)それをテストし、それを確認することさえできます。これは 'XML PATH'構文を見たときに私が考えた最初のものです。 (私は質問を汚染したくないので何も言わなかった)。 –