如何从sql作业中获得结果,而不必每次都运行它



我是新来的。我的场景是,我已经创建了表A、B和C,它们彼此相关。

每当我需要这三个表中的数据时,我总是需要将它们连接起来以获得结果。一直这样做有点浪费时间。

因此,我创建了一个表'R'和一个过程来更新其内容。在这个过程中,我连接了所有表(A、B和C),并将结果存储在表r中。

为了将结果放入该表,我创建了一个每天运行一次的SqlJob。然而,有一个问题。有时我想要A, B和C表中最近插入记录的结果(在R更新之前)。

是否有任何解决方案可以每次从R表中获得结果,而无需运行SqlJob来不断更新它?

我想要的解决方案是,任何时候我需要数据,查询表R, 而不是连接表A, B和c。您的解决方案必须考虑到这一点。

谢谢。

创建一个数据库视图,而不是运行一个过程来不断更新表'R'。这个视图将A、B和C连接在一起。

然后,任何时候你需要查询A, B和C,而不是冒着查询表R获取过时数据的风险,你可以查询视图。

我不知道你的数据库模式,所以我不知道连接表A, B和C的字段,但它可能看起来像这样:

CREATE VIEW V1
AS
SELECT * FROM A INNER JOIN B ON A.X = B.X INNER JOIN C ON B.Y = C.Y;

要查询视图,可以使用SELECT语句,就像使用表一样:

SELECT * FROM V1;

在R表中添加timex(时间戳)列。所以你可以随时得到最新的结果集

根据OP的反馈,表'R'必须始终是被查询的表(这是家庭作业吗?),那么我认为唯一的解决方案是在每个表'A', 'B'和'C'上放置一个更新触发器,以便当任何这些表更新时,它们更新的内容自动放置在表'R'中。

虽然效率不高,但至少比按时间运行存储过程(例如每5分钟运行一次)要好。

CREATE PROCEDURE [usp_SyncR]
AS
BEGIN
    SET NOCOUNT ON;
    UPDATE [R]
        SELECT * 
               GETUTCDATE() as [UpdatedOn]
            FROM A INNER JOIN B ON A.X = B.X INNER JOIN C ON B.Y = C.Y
END
CREATE TRIGGER [trg_A_Sync_R]
    ON [A]
AFTER Update
AS 
BEGIN
    EXEC [usp_SyncR];
END
CREATE TRIGGER [trg_B_Sync_R]
    ON [B]
AFTER Update
AS 
BEGIN
    EXEC [usp_SyncR];
END
CREATE TRIGGER [trg_C_Sync_R]
    ON [C]
AFTER Update
AS 
BEGIN
    EXEC [usp_SyncR];
END

相关内容

最新更新