문제

말하자면, 나는 객체 레코드 용으로, 하나는이 객체에 대한 활동 레코드를위한 두 개의 테이블이 있습니다.

객체가 삽입되거나 업데이트 될 때 마다이 활동 테이블에 새 레코드를 삽입하고 있습니다.

간단한 방식으로 말하면 활동 테이블에 네 개의 필드가 있다고 가정합니다. ObjectId, 유형, 상태 및 날짜.

객체가 업데이트 될 때, 나는 객체의 마지막 상태를 가져 와서 변경 사항을 찾을 계획입니다. 업데이트 값과 이전 값 사이에 차이가 있다면 새 입력으로 값을 설정하고 그렇지 않으면 NULL을 설정하겠습니다. 예를 들어 업데이트 프로세스에서 사용자는 객체의 상태 값 만 변경하지만 유형 값을 동일하게 남겨 두므로 유형에 대한 널 값과 상태에 대한 새 값을 가진 새 행을 삽입합니다.

SELECT * FROM Activity;

oid   type   status   date
-----------------------------------------
1     0      1        2009.03.05 17:58:07
1     null   2        2009.03.06 07:00:00
1     1      null     2009.03.07 20:18:07
1     3      null     2009.03.08 07:00:00

그래서 나는보기를 만들어야합니다. 내 객체의 현재 상태를 알려줍니다.

SELECT * FROM ObjectStateView Where oid = 1;

oid   type   status   date
-----------------------------------------
1     3      2        2009.03.08 07:00:00

이 _를 어떻게 달성합니까?

도움이 되었습니까?

해결책

날짜를 사용하여 최신 레코드를 찾을 수 있다고 가정 할 수 있습니다.

CREATE VIEW foo
AS
    SELECT
        A.oid,
        (SELECT TOP 1 type FROM Activity At WHERE At.OID = A.oid AND At.Date <= MAX(A.date) AND type IS NOT NULL),
        (SELECT TOP 1 status FROM Activity Ast WHERE Ast.OID = A.oid AND Ast.Date <= MAX(A.date) AND status IS NOT NULL),
        MAX(A.date) AS date
    FROM
        Activity A
GO

편집 : 가입을 원한다면 (Untested)

CREATE VIEW foo
AS
    SELECT TOP 1
        A.oid,
        At.type,
        Ast.status,
        A.date
    FROM
        Activity A
        LEFT JOIN
        (SELECT TOP 1 oid, date, type FROM Activity WHERE type IS NOT NULL ORDER BY date DESC) At ON A.OID = At.oid
        LEFT JOIN
        (SELECT TOP 1 oid, date, status FROM Activity WHERE status IS NOT NULL ORDER BY date DESC) Ast ON A.OID = Ast.oid
    ORDER BY date DESC
GO

이것을 이전에 추가했을 것입니다.

표 11의 다른 시간을 터치해야하기 때문에 기하 급수적으로 확장됩니다.

더 나은 솔루션은 "현재"테이블을 유지하고 활동 방아쇠를 통해 유지하는 것입니다.

다른 팁

사용을 고려 했습니까? 맥스 기능?

select oid, type, status, MAX(date) as max_date 
from ObjectStateView 
where oid = 1

왜 당신이 거기에 널을 원하는지 잘 모르겠습니다. 최신 항목을 이전 항목과 비교하여 입력간에 변경된 내용을 추적 할 수 있습니다. 그런 다음 객체의 현재 상태는 테이블의 최신 항목입니다. 변경 사항을 추적하려는 객체의 해시를 생성하여 추가 열로 저장하여 객체가 변경되었는지 확인할 수 있습니다.

역사적 가치 :

변경 사항을 추적하므로 역사적으로 객체의 상태를보고 싶을 수도 있습니다.

SELECT      a.oid,
            a.date,
            a_type.type,
            a_status.status
FROM        Activity a
LEFT JOIN   Activity a_type
        ON  a_type.oid = a.oid
        AND a_type.date = (SELECT TOP 1 date FROM Activity WHERE oid = a.oid AND date <= a.date AND type IS NOT NULL ORDER BY date DESC)
LEFT JOIN   Activity a_status
        ON  a_status.oid = a.oid
        AND a_status.date = (SELECT TOP 1 date FROM Activity where oid = a.oid AND date <= a.date AND status IS NOT NULL ORDER BY date DESC)

돌아올 것입니다 :

oid         date       type        status
----------- ---------- ----------- -----------
1           2009-03-05 0           1
1           2009-03-06 0           2
1           2009-03-07 1           2
1           2009-03-08 3           2

성능 고려 :

반면에, 몇 개의 필드 만 있고 테이블이 커지면 성능이 문제가됩니다. 이 경우 다른 테이블에 전체 값을 저장/캐시하는 것도 의미가 있습니다. Mydatahistory, 위에 표시된 표에있는 데이터가 포함되어 있습니다. 그런 다음 현재 (최신) 버전을 선택하는 것은 OID 및 날짜별로 최신 행 (1 행만으로)을 필터링하는 SQL보기를 사용하여 사소한 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top