加入T-SQL视图

时间:2017-04-25 12:20:26

标签: tsql view sql-server-2014

我正在观看。我现在拥有的是:

CREATE VIEW [dbo].[vwEventDetails]
AS
SELECT 
    ISNULL(ROW_NUMBER() OVER (ORDER BY EventID), 999999999) AS Row,
    STUFF(DetectorID, len(DetectorID), 1, '0') as SiteID,
    DetectorID AS DetectorID,
    StartedOn AS StartedOn,
    EndedOn AS EndedON,
    EventDescription AS EventDescription,
    EventCategoryID AS EventCategoryID,
    EventSeverityLevelID AS EventSeverityLevelID,
    EventStatusID AS EventStatusID,
    Processed AS Processed,
    CASE WHEN EndedOn IS NOT NULL
        THEN
            DATEDIFF(SECOND, StartedOn, EndedOn)/ 3600.0
        ELSE 
            DATEDIFF(SECOND, StartedOn, CURRENT_TIMESTAMP)/ 3600.0
    END
        AS Duration

FROM Event

GO

我从这个观点得到的结果是: View Result

我得到的结果是正确的。但是,我还需要一个不在事件表中的值。我不知道如何获得这个价值。

该视图基于事件表。看起来像这样:

Event Table

现在在此表中有一行名为 DetectorID DetectorID 指向表:检测器

Detector Table

在此表格中,您会看到名为 TrackID 的行 TrackID 会导致表格跟踪

Track Table

在表格中有一行名为 TrackName 这是我想要在视图中的值。 有没有办法实现这个目标?

所以基本上是一个简短的总结。 有办法离开:

  

活动 - >检测器 - >轨道

通过基于事件的视图?

2 个答案:

答案 0 :(得分:1)

在sql中加入其他表是一个相当标准的事情。

您可以使用inner join仅返回匹配DetectorTrack的行,或者当可能没有匹配值时使用left join相应的表格。

此外,row_number()不会返回null,没有理由将其包含在isnull()中。

--create view dbo.vwEventDetails as
select 
    row_number() over (order by e.EventId) as Row
  , stuff(DetectorId, len(e.DetectorId), 1, '0') as SiteId
  , e.DetectorId
  , e.StartedO
  , e.EndedOn
  , e.EventDescription
  , e.EventCategoryId
  , e.EventSeverityLevelId
  , e.EventStatusId
  , e.Processed
  , case when e.EndedOn is not null
        then datediff(second, e.StartedOn, e.EndedOn)/ 3600.0
      else datediff(second, e.StartedOn, current_timestamp)/ 3600.0
      end as Duration
  , t.TrackId
  , t.FromName
  , t.ToName
  , t.TrackName
from Event e
  inner join Detector d
    on e.DetectorId = d.DetectorId
  inner join Track t
    on d.TrackId = t.TrackId

答案 1 :(得分:1)

您可以使用两个连接语句来执行此操作:

...
FROM Event
JOIN Detector ON Event.DetectorID = Detector.DetectorID
JOIN Track ON Detector.DetectorID = Track.TrackID

然后将Track.TrackName添加到选择字段的末尾

(您必须在其他字段之前添加Event.,其中包含具有相同名称的列)