【问题标题】:SQL Server: Replicate data from multiple tables into oneSQL Server:将多个表中的数据复制到一个表中
【发布时间】:2019-12-07 03:52:28
【问题描述】:

是否可以将多个表中的数据实时复制到一个表中?

例如我有 3 个表:

  • 表:DriverLocation
    列:DriverId, Latitude, Longtide, GpsLastUpdate, Speed, ...

  • 表:驱动程序
    列:DriverId、FirstName、LastName、Address、IsActive、...

  • 表:工作
    列:JobId、DriverId、JobName、Pickup、Delivery、...

我想在这 3 个表之间创建一个连接查询,并将该数据实时发布到一个名为 RealTimeDriverInfo 的表中。

示例(伪代码):

Driver(FirstName, LastName) 
JOIN DriverLocatoin(Latitude, Longitude) 
JOIN Job(JobName)
PUT RESULT IN REAL TIME INTO => RealTimeDriverInfo table

这可能吗?

编辑:注意:

我希望数据在一个表中的原因是因为我想使用这个 c# 库从一个表中获取实时通知,这个库只适用于表,不幸的是你不能加入多个表只监视一个表,库是SQLTableDependency

.NET 库,用于监控 SQL 表中的 chagnes(它只能用于表,不能用于视图,您只能监控一个表,而不能连接多个表) https://github.com/christiandelbianco/monitor-table-change-with-sqltabledependency

这就是为什么我需要以某种方式将多个表连接到一个表中

【问题讨论】:

  • 你的意思是Insert into RealTimeDriverInfo () select () from Driver JOIN DriverLocation on ... JOIN Job ..?这取决于您的感受是实时的。每次插入、更新或删除行时,您可以触发数据库系统自动运行的触发器。
  • 为什么不创建一个Sql View呢?
  • @MarkKram 我希望数据在表中的原因是因为我想使用这个 c# 库从表中获取实时通知,这个库只适用于表,不幸的是你不能join多表只监控一张表,库是SQLTableDependency(github.com/christiandelbianco/…)

标签: sql .net sql-server


【解决方案1】:

首先,一个简单的视图可以做你想做的事:

CREATE v_RealTimeDriverInfo 
    SELECT D.FirstName, D.LastName, DL.Latitude, DL.Longitude, J.JobName
    FROM Driver D JOIN
         DriverLocation DL
         ON D.DriverID = DL.DriverID JOIN
         Job J 
         ON J.DriverID = D.DriverID;

在用于JOINing 的列上有索引,这通常在查询时足够快。这是做你想做的事的“标准”方式。

如果您确实想要一个始终保持最新的单独“虚拟”表,那么您需要类似于 物化视图 的东西,SQL Server 支持 indexed views。这个想法是 index 在底层数据发生变化时保持“实时”。

对于您的示例,它看起来像:

CREATE v_RealTimeDriverInfo 
    SELECT D.FirstName, D.LastName, DL.Latitude, DL.Longitude, J.JobName
    FROM Driver D JOIN
         DriverLocation DL
         ON D.DriverID = DL.DriverID JOIN
         Job J 
         ON J.DriverID = D.DriverID;

CREATE UNIQUE CLUSTERED INDEX v_RealTimeDriverInfo_pk ON (D.FirstName, D.LastName, DL.Latitude, DL.Longitude, J.JobName);

【讨论】:

  • 我希望数据在一个表中的原因是因为我想使用这个 c# 库从一个表中获取实时通知,这个库只适用于表,不幸的是你不能加入多个tables 只监控一张表,库是 SQLTableDependency (github.com/christiandelbianco/…)
  • @EricBergman 。 . .你是说它不适用于视图?它是否适用于索引视图?
  • 它不适用于任何类型的视图,它只适用于表格。
  • @EricBergman - 你不能在这个视图上触发吗?您的触发器将更新 RealTimerDriverInfo 表,而 SQLTableDependency 将监视该 1 个表。
【解决方案2】:

是否需要插入不同的表?在这种情况下,一个视图就足够了。我假设JobId 是一个整数,每个作业都会增加一。我使用CROSS APPLY 获取最近的位置和工作。您还必须有一些逻辑来确定驱动程序是否处于活动状态。

select      a.FirstName     FirstName
            ,a.LastName     LastName
            ,b.Latitude     Latitude
            ,b.Longitude    Longitude
            ,c.JobName      JobName
from        Driver          a
cross apply (
                select      top 1
                            *
                from        DriverLocation  b
                where       b.DriverId = a.DriverId
                order by    b.GpsLastUpdate desc
            )               b
cross apply (
                select      top 1
                            c.*
                from        Job c
                where       c.DriverId = a.DriverId
                order by    c.JobId desc
            )               c

【讨论】:

  • 我希望数据在一个表中的原因是因为我想使用这个 c# 库从一个表中获取实时通知,这个库只适用于表,不幸的是你不能加入多个tables只监控一张表,库是SQLTableDependency (github.com/christiandelbianco/…)
  • 在这种情况下,在 tub select 上方放置一个插入语句,它应该可以工作!
【解决方案3】:

当然可以,只需快速加入几次即可。但似乎创建视图可能会更好地为您服务。

INSERT INTO RealTimeDriverInfo (FirstName,LastName,Latitude,Longitude,JobName)
SELECT D.FirstName, D.LastName,DL.Latitude, DL.Longitude,J.JobName
FROM Driver D
INNER JOIN DriverLocation DL on D.DriverID = DL.DriverID
INNER JOIN Job J on J.DriverID = D.DriverID

【讨论】:

  • 。 .我对你的回答感到困惑。您正在推荐一个视图,但没有展示如何实现它。
  • 我在回答他提出的问题。我建议他使用视图,但鉴于他提供的信息有限,我不知道他是否真的只想插入记录。如果他真的想使用视图,那么您的答案是完美的
  • @JM_ 我希望数据在表中的原因是因为我想使用这个 c# 库从表中获取实时通知,这个库只适用于表,不幸的是你不能join多表只监控一张表,库是SQLTableDependency(github.com/christiandelbianco/…)
  • @JM_ 也希望如此,只是想知道是否可以将多个表实时复制到一个表中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-21
  • 1970-01-01
  • 2011-07-14
  • 1970-01-01
  • 2011-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多