我是SSC的新手。我的情况是我创建了彼此相关的表A,B和C.
每当我需要来自这三个表的数据时,我总是需要加入它们才能获得结果。这样做有点费时。
因此我创建了一个表'R'和一个更新其内容的过程。在此过程中,我将连接所有表(A,B和C)并将结果存储在表R中。
要将结果输入此表,我创建了一个每天运行一次的SqlJob。但是,有一个问题。有时我想要A,B和C表中最近插入记录的结果(在R更新之前)。
是否有任何解决方案每次都可以从R表中获取结果而不运行SqlJob来不断更新它?
其他信息
我想要的解决方案是,只要我需要数据,就会查询表R,不连接的表A,B和C.您的解决方案必须考虑到这一点。
谢谢。
答案 0 :(得分:1)
不是运行程序来不断更新表'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;
答案 1 :(得分:0)
在R表中添加timex(timestamp)列。 所以在任何时候你都可以获得最新的结果集。
答案 2 :(得分:0)
根据OP的反馈,表格' R'必须始终是查询的表格(这是作业吗?),然后我想唯一的解决方案是在每个表格上放置更新触发器' A',&#39 ; B'和' C'这样当任何这些表格更新时,他们更新的内容会自动放在表格中。
虽然效率低下,但至少这比在一段时间内运行存储过程更好,例如每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