2011-12-05 4 views
1

私はトランザクションデータベースを使って作業しています:テーブルの行が値のセットとして定義されているリレーショナルデータベースある時点でデータベースはその行を "考える"フィールドにはスキーマのSQL:テーブルの値の関数としてのビュー

パート:ID、見出し、本文:つまり

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) 
); 

、仮想 "条" の表は、3つの列があります。

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

3つのストアドプロシージャを作成し、変数にtimeをそれぞれ渡すことができます。

Article_headline_atおよびArticle_body_old_atは、これらのストアドプロシージャをArticle_atストアドプロシージャ内のテンポラリテーブルに挿入し、クエリを実行します。これはあなたの解決策になる可能性:

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; 

----- 

ので、すべての最後に、あなたが行うことができます

EXEC Article_at @theTime = "2011-11-03 16時05分23秒"

しかし、私はもっと簡単な方法があると確信していますが、これは私が考えることができる唯一の方法です。

+1

最初の2つの手順は、実際に私が必要とするものです。それでは、私はちょうど3番目のプロシージャを作成します:プロシージャを作成します:Article_at @theTime DATETIME SELECT ID、見出し、本文から本文、Article_headline_at(@theTime)、Article_body_at(@theTime) – Jordan

関連する問題