문제

이것은 충분히 간단해야하지만 어떻게 든 내 뇌가 작동을 멈췄습니다.

두 개의 관련 테이블이 있습니다.

1 번 테이블:

ID (PK), Value1

Table 2:

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

예제 :

1 번 테이블:

ID  Value1
1   A
2   B

Table 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

문제는 간단합니다. 테이블과의 결합 결과를 제한하는 방법. 비슷한 질문이 있었지만 내 것과 같은 것을 찾을 수 없습니다. MySQL에서 비슷한 모습이 있습니다.SQL 조인 제한

속도가 큰 데이터 세트가되기 때문에 속도가 여전히 주요 우선 순위이지만 모든 접근 방식에 열려 있습니다.

도움이 되었습니까?

해결책

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

다른 팁

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

노력하다

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

가장 최근에 필터링하는 그룹 또는 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
)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top