4

これは十分に単純なはずですが、どういうわけか私の脳は機能しなくなりました。

関連するテーブルが 2 つあります。

表1:

ID (PK), Value1

表 2:

BatchID, Table1ID (FK to Table 1 ID), Value2

サンプルデータ:

表1:

ID  Value1
1   A
2   B

表 2:

BatchID  Table1ID  Value2
1        1         100
2        1         101
3        1         102
1        2         200
2        2         201

ここで、表 1 の各レコードに対して、表 2 で一致するレコードを作成したいと思いますが、最新のレコードのみです (バッチ ID は連続しています)。上記の例の結果は次のようになります。

Table1.ID  Table1.Value1  Table2.Value2
1          A              102
2          B              201

問題は単純で、テーブル 2 との結合結果を制限する方法です。SO にも同様の質問がありましたが、私のようなものは見つかりません。これは、MySQL での類似した例です: LIMITing an SQL JOIN

大きなデータセットになるため、速度が依然として最優先事項ですが、私はどのようなアプローチにもオープンです。

4

4 に答える 4

10
WITH Latest AS (
    SELECT Table1ID
        ,MAX(BatchID) AS BatchID
    FROM Table2
    GROUP BY Table1ID
)
SELECT *
FROM Table1
INNER JOIN Latest
    ON Latest.Table1ID = Table1.ID
INNER JOIN Table2
    ON Table2.BatchID = Latest.BatchID
于 2009-06-22T14:07:36.687 に答える
3
SELECT  id, value1, value2
FROM    (
        SELECT  t1.id, t2.value1, t2.value2, ROW_NUMBER() OVER (PARTITION BY t1.id ORDER BY t2.BatchID DESC) AS rn
        FROM    table1 t1
        JOIN    table2 t2
        ON      t2.table1id = t1.id
        ) q
WHERE   rn = 1
于 2009-06-22T14:09:19.117 に答える
0

試す

select t1.*,t2.Value2
from(
select Table1ID,max(Value2) as Value2
from [Table 2]
group by Table1ID) t2
join [Table 1] t1 on t2.Table1ID = t1.id
于 2009-06-22T14:10:49.163 に答える
-1

最新のものをフィルター処理する GROUP BY または WHERE 句のいずれか:

SELECT * FROM Table1 a
INNER JOIN Table2 b ON (a.id = b.Table1ID)
WHERE NOT EXISTS(
      SELECT 1 FROM Table2 c WHERE c.Table1ID = a.id AND c.BatchID > b. BatchID
)
于 2009-06-22T14:06:43.617 に答える