2011-06-20 16 views
2

複数のテーブルが7つ以上あります。 マスターテーブルと他のすべての子テーブルがあります(FKからマスタテーブルのプライマリ列ID)。 すべてのテーブルには、マスタテーブルを含む特定のIDの複数のレコードがあり、日付(有効日)までに追跡されます。最新の日付レコードは、各テーブルのアクティブレコードとみなされます。複数のレコードが日付別にトラッキングされたテーブルを照会する

それらを結合して各テーブルから最新のレコードを返すためのすばらしい方法がありますか? 今、私は各テーブルからmaxを選択し、それを結合して別のテーブルの最近のレコードを返します。

+0

(有効日)列にインデックスがありますか? – RThomas

+0

はい(primarkey、effdt) –

答えて

0

inkex(id、effdt)を使用しているので、私はあなたのスキーマをクエリする最も効率的な方法を既に説明していると思います。少なくとも、あなたが記述方法は、私はそれを行う方法です...

SELECT 
    * 
FROM 
    master 
INNER JOIN 
    child1 
    ON child1.id = master.id 
INNER JOIN 
    child2 
    ON child2.id = master.id 
WHERE 
     master.effdt = (SELECT TOP 1 effdt FROM master AS lookup WHERE id = master.id) 
    AND child1.effdt = (SELECT TOP 1 effdt FROM child1 AS lookup WHERE id = child1.id) 
    AND child2.effdt = (SELECT TOP 1 effdt FROM child2 AS lookup WHERE id = child2.id) 

は異なるサブクエリを解決(私はTOP 1を使用し、MAX()も動作します)、インデックス・ルックアップとなります。私は重大なパフォーマンス上の利点であることが覚えていませんが、代替は、あり

...さらに

SELECT 
    * 
FROM 
    (SELECT ROW_NUMBER() OVER (PARTITION BY id ORDER BY effdt), * FROM master) AS master 
INNER JOIN 
    (SELECT ROW_NUMBER() OVER (PARTITION BY id ORDER BY effdt), * FROM child1) AS child1 
    ON child1.id = master.id 
INNER JOIN 
    (SELECT ROW_NUMBER() OVER (PARTITION BY id ORDER BY effdt), * FROM child2) AS child2 
    ON child2.id = master.id 
WHERE 
     master.seq_id = 1 
    AND child1.seq_id = 1 
    AND child2.seq_id = 1 

、... Maziarで述べたようにCROSSは、オプションを適用がある

SELECT 
    * 
FROM 
    master 
CROSS APPLY 
    (SELECT TOP 1 * FROM child1 WHERE id = master.id ORDER BY effdt DESC) AS child1 
CROSS APPLY 
    (SELECT TOP 1 * FROM child2 WHERE id = master.id ORDER BY effdt DESC) AS child2 
WHERE 
    master.effdt = (SELECT TOP 1 effdt FROM master AS lookup WHERE id = master.id) 
0

各テーブルのTOP 1を返すすべてのテーブルのビューを作成することがあります。ORDER BY有効日。

メインクエリでは、すべてのビューでJOINを実行します。あなたはこのような何か書くことができます

0

select * from masterTable m 
cross apply (select top 1 null as dummy from masterTable m2 where m2.id= m.id order by m2.effectDate desc) mm1 
cross apply (select top 1 * from detailTable1 d1 where d1.masterId = m.id order by d1.effectDate desc) dd1 
cross apply (select top 1 * from detailTable2 d2 where d2.masterId = m.id order by d2.effectDate desc) dd2 
cross apply (select top 1 * from detailTable2 d2 where d3.masterId = m.id order by d3.effectDate desc) dd2 

を私はあなたのテーブルを持っていないので、私はこれをテストすることはできません、このことができます願っています。

+0

私のマスターテーブルにも複数のレコードがあります –

+0

投稿を編集しました。実行計画をチェックしてこのクエリとパフォーマンスの違いを確認することを忘れないでください –

+0

クエリには脆弱性があります。マスターテーブルでトップ1 *を使用すると1つのレコードのみが返されます。 –

関連する問題