2017-04-25 3 views
1

보기를 만들고 있습니다. 무엇 내가 지금 가지고있는 것은 :T-SQL보기에 참여하십시오.

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

내가지고있어 결과는 정확합니다. 그러나, 나는 이벤트 테이블에없는 1 더 많은 가치가 필요합니다. 그리고 나는이 가치를 얻는 방법을 모른다.

보기는 이벤트 테이블을 기반으로합니다. 이는 다음과 같습니다

Event Table

지금이 테이블에 DetectorID라는 행이 있습니다.
DetectorID 테이블에 이르게 : 감지기 :

Detector Table

이 표에서, 당신은 TrackID라는 행을 볼 수 있습니다.
TrackID 테이블 트랙 리드 :

Track Table

표에서 TrackName라는 행이 존재한다.
이것은 내가보기에 원하는 값입니다. 이 방법이 있습니까?

기본적으로 짧은 요약입니다. 이벤트을 기반으로하는 뷰를 통해> 트랙

-> 감지기 -

이벤트 : 에서 갈 수있는 방법이 있습니까?

답변

1

다른 테이블에 조인하는 것은 SQL에서 상당히 표준적인 작업입니다.

당신은 일치하는 DetectorTrack이있는 곳 행만 반환에 inner join를 사용하거나 해당 테이블에 값이 일치되지 않을 때 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 
+0

고맙습니다. 조인스에 대해 많이 알지 못하고 여러 테이블에 조인하는 방법을 몰랐습니다. 또한보기에도. 하지만 고맙습니다. – Mitch

+1

@Mitch 도와 드리겠습니다! – SqlZim

1

당신은 두 개의 조인 문으로 작업을 수행 할 수 있습니다

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

그런 다음 선택 필드

의 끝에 Track.TrackName를 추가 (당신은 당신의 다른 분야 곳 전에 Event.를 추가해야합니다 같은 이름의 열이 있음)