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)
(有効日)列にインデックスがありますか? – RThomas
はい(primarkey、effdt) –