-1

SSMS 2008 R2 を使用して TSQL クエリを開発しており、現在多くの左結合を使用しているこの sproc を最適化したいと考えています。1 つの行/ルックアップ値を含むルックアップ テーブルがあります。したがって、私の TSQL コードは次のようになります。

Table A = main record table
Table B = Lookup Table
  row1 x unique_identifier, y varchar(100)
  row2 x unique_identifier, y varchar(100)
  row3 x unique_identifier, y varchar(100)
  row4 x unique_identifier, y varchar(100)

したがって、このルックアップ テーブルの各行には 2 つの値があります。1 つは unique_identifier で、もう 1 つは varchar です。現在、私の sproc コードは次のようになっています。

select *
FROM A
LEFT JOIN B ON B.X = A.X WHERE B.X = 123456
LEFT JOIN B2 ON B2.X = A.X WHERE B2.X = 123457
LEFT JOIN B3 ON B3.X = A.X WHERE B3.X = 123458
LEFT JOIN B4 ON B4.X = A.X WHERE B4.X = 123459
LEFT JOIN B5 ON B5.X = A.X WHERE B5.X = 123451

ただし、これを行うためのより効率的な方法があるはずです。そして、私の実際の sproc コードは、実際にはこのルックアップ テーブルに 5 回ではなく 30 回参加しています。一時テーブルも使用してみましたが、最適化されていないようです。すべての LEFT JOIN を置き換える方法に関する推奨事項はありますか?

わかりましたので、今この質問を更新しています。これは私の正確なクエリです:

SELECT DISTINCT 
    lut.[description] as UDT_Injuries,  
    lut2.[description] as abduction, 
    lut3.[description] as ARREST_PARENT
FROM evolv_cs.dbo.incident_header_x x with (nolock)
LEFT JOIN user_defined_lut_rv lut on lut.user_defined_lut_id = x.UDT_Injuries
LEFT JOIN user_defined_lut_rv lut2 on lut2.user_defined_lut_id = x.ABDUCTION
LEFT JOIN user_defined_lut_rv lut3 on lut3.user_defined_lut_id = x.ARREST_PARENT
WHERE lut.[description] IS NOT NULL OR lut2.[description] IS NOT NULL OR lut3.[description] IS NOT NULL 

このクエリの出力の最初の 10 行:

UDT_Injuries    abduction   ARREST_PARENT
NULL    NULL    Outside of facility
Client  NULL    NULL
Client  NULL    Outside of facility
None    NULL    NULL
None    NULL    Outside of facility
Other adult NULL    NULL
Other adult NULL    Outside of facility
Parent  NULL    NULL
Peer    NULL    NULL
Sibling NULL    NULL

参考までに、PIVOT と UNPIVOT に関する記事を見ましたが、データを集計したくありません。代わりに、incident_header_x のキー ID 値を user_defined_lut_rv の varchar 値に変換したいと考えています。

incident_header_x のサンプル データは次のようになります。

UDT_Injuries    ABDUCTION   ARREST_PARENT
5B84773B-99BF-4EB9-8545-EFC06A35FE29    NULL    NULL
NULL    4F18EDE9-BBBA-4430-9EF4-4E28EAC1E6D4    NULL
5B84773B-99BF-4EB9-8545-EFC06A35FE29    NULL    NULL
NULL    NULL    4F18EDE9-BBBA-4430-9EF4-4E28EAC1E6D4
NULL    NULL    5B84773B-99BF-4EB9-8545-EFC06A35FE29

これは、私が達成しようとしていることを意味していますか? これらの id 値を user_defined_lut_rv ルックアップ テーブルの varchar 値に変換するには?

4

2 に答える 2

1

結合条件は常に同じなので、ピボットを探しているようです: http://msdn.microsoft.com/en-us/library/ms177410(v=sql.105).aspx

これがあなたが探しているものでない場合は、詳細を提供してください。サンプルデータと期待される結果は、素晴らしい出発点です。

于 2013-02-11T19:30:53.230 に答える
1

要するに、いいえ-これを行うためのより効率的な方法や別の方法はありません. パフォーマンスの問題がありますか、それともコードが扱いにくいと思いますか?

とにかく、この設計の欠点と利点のアイデアを得るために、これが似ている (同一ではない) '1 つの真のルックアップ テーブル' について調査することをお勧めします。

于 2013-02-11T22:35:56.730 に答える