Question

Je travaille avec une base de données transactionnelle:. Une base de données relationnelle où une ligne dans une table est définie comme l'ensemble des valeurs de la base de données, à un moment donné, « pense » champs de la ligne contiennent

Une partie du schéma:

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

En d'autres termes, la table "article" virtuel a trois colonnes: id., Titre, et le corps

Je peux créer des vues temporaires pour représenter la table « article » virtuel défini par un temps donné:

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;

Je dois créer ces trois vues temporaires chaque fois que je veux interroger la base de données pour obtenir un article, que je préfère ne pas faire. Je préférerais créer vue permanent « fonctions » dans le cadre du schéma lui-même:

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;

Et puis, quand je veux choisir un article de la base de données:

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

Est-ce que SQL ont une fonctionnalité similaire?

Était-ce utile?

La solution

Vous pouvez créer trois procédures stockées et passer thetime comme une variable à chacun.

Pour Article_headline_at et Article_body_old_at insérer ces procédures stockées dans une table temporaire à l'intérieur des procédures stockées Article_at et faire la requête. Cela pourrait être votre solution:

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;

-----

à la fin de tout ce que vous pouvez faire

exec Article_at @theTime = "2011-11-03 16:05:23"

mais je suis sûr qu'il ya un moyen plus facile autour mais la seule façon que je peux penser.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top