2011-12-05 1 views
1

나는 트랜잭션 데이터베이스로 작업하고 있습니다 : 테이블의 행이 값의 집합으로 정의되는 관계형 데이터베이스 주어진 시간에 데이터베이스는 행의 "생각"을 처리합니다. 필드에 포함됩니다. 스키마의SQL : 테이블의 값의 함수로보기

부 : 아이디, 제목, 몸과 : 즉

CREATE TABLE Article 
(
    id INTEGER, 
    PRIMARY KEY(id) 
); 

CREATE TABLE Article_headline 
(
    Article_id INTEGER, 
    headline TEXT, 
    tt DATETIME 
    FOREIGN KEY(Article_id) REFERENCES Article(id) 
); 

CREATE TABLE Article_body 
(
    Article_id INTEGER, 
    body TEXT, 
    tt DATETIME 
    FOREIGN KEY(Article_id) REFERENCES Article(id) 
); 

는 가상 "조"표는 세 개의 열이 있습니다.

CREATE TEMPORARY VIEW Article_headline_old 
AS SELECT Article_id, headline, MAX(tt) 
FROM Article_headline 
WHERE tt <= "2011-11-03 16:05:23" 
GROUP BY Article_id; 

CREATE TEMPORARY VIEW Article_body_old 
AS SELECT Article_id, body, MAX(tt) 
FROM Article_body 
WHERE tt <= "2011-11-03 16:05:23" 
GROUP BY Article_id; 

CREATE TEMPORARY VIEW Article_old 
AS SELECT id, headline, body 
FROM Article, Article_headline_old, Article_body_old 
WHERE Article_headline_old.Article_id = Article.id 
AND Article_body_old.Article_id = Article.id; 

나는이 세 가지 일시적인보기 내가 기사를 얻기 위해 데이터베이스를 조회 할 때마다 작성해야 : 나는 주어진 시간에 의해 정의 된 가상 "조"테이블을 표현하기 위해 일시적으로 뷰를 만들 수 있습니다

, 나는 그것을하지 않을 것이다. 나는 스키마 자체의 일환으로 영구적보기 "기능"을 만들 것을 선호 :

CREATE VIEW Article_headline_at(theTime) 
AS SELECT Article_id, headline, MAX(tt) 
FROM Article_headline 
WHERE tt <= theTime 
GROUP BY Article_id; 

CREATE VIEW Article_body_at(theTime) 
AS SELECT Article_id, body, MAX(tt) 
FROM Article_body 
WHERE tt <= theTime 
GROUP BY Article_id; 

CREATE VIEW Article_at(theTime) 
AS SELECT id, headline, body 
FROM Article, 
    Article_headline_at(theTime) AS Article_headline_old, 
    Article_body_at(theTime) AS Article_body_old 
WHERE Article_headline_old.Article_id = Article.id 
AND Article_body_old.Article_id = Article.id; 

그리고 나는 데이터베이스에서 기사를 선택하고자 할 때 :

SELECT * FROM Article_at("2011-11-03 16:05:23"); 

합니까 SQL은 유사한 기능이를 ?

답변

1

세 개의 저장 프로 시저를 만들고 time을 변수로 각각 전달할 수 있습니다.

Article_headline_at 및 Article_body_old_at는이 저장 프로 시저를 Article_st 내장 프로 시저의 임시 테이블에 삽입하고 쿼리를 수행합니다. 이것은 당신의 해결책이 될 수있다 :

CREATE PROCEDURE Article_headline_at @theTime datetime as 

SELECT Article_id, headline, MAX(tt) 
FROM Article_headline 
WHERE tt <= theTime 
GROUP BY Article_id; 

----- 



CREATE PROCEDURE Article_body_old_at @theTime datetime as 
SELECT Article_id, body, MAX(tt) 
FROM Article_body 
WHERE tt <= theTime 
GROUP BY Article_id; 

----- 

CREATE PROCEDURE Article_at @theTime datetime as 
IF OBJECT_ID('tempdb.dbo.#Article_headline_at') IS NOT NULL DROP TABLE tempdb.dbo.#Article_headline_at 
IF OBJECT_ID('tempdb.dbo.#Article_body_old_at') IS NOT NULL DROP TABLE tempdb.dbo.#Article_body_old_at 

create table #Article_headline_at (
Article_id int, 
body nvarchar(max), 
tt int 
) 

create table #Article_body_old_at (
Article_id int, 
headline nvarchar(max), 
tt int 
) 

declare @sql1 nvarchar(max) 
declare @sql2 nvarchar(max) 

set @sql1 = 'insert into #Article_headline_at exeC#Article_headline_at @theTime = '''+ @theTime + '''' 
set @sql2 = 'insert into #Article_body_old_at exeC#Article_body_old_at @theTime = '''+ @theTime + '''' 

exec sp_executesql @sql1 
exec sp_executesql @sql2 


SELECT id, headline, body 
FROM Article, #Article_headline_at(theTime), #Article_body_at(theTime) 
WHERE #Article_headline_old.Article_id = Article.id 
AND #Article_body_old.Article_id = Article.id; 

----- 

그래서 모든의 끝에서 당신이 할 수있는

간부 Article_at @theTime = "2011-11-03 16시 5분 23초"

하지만이 방법을 사용하는 것이 더 쉬운 방법 일 것이라고 확신하지만이 방법은 내가 생각할 수있는 유일한 방법입니다.

+1

처음 두 절차는 실제로 내가 필요한 것입니다. 그런 다음 제 3의 프로 시저를 작성합니다. 프로 시저 작성 : Article_at @theTime DATETIME SELECT ID, 제목, body FROM Article, Article_headline_at (@theTime), Article_body_at (@theTime) – Jordan