2016-06-08 1 views
0

여러 외부 조인 결과를 단일 행의 데이터로 결합하는 쿼리를 작성하려고합니다. 몇 가지 CTE를 가지고 놀았지만 솔루션에 대한 내 머리를 감쌀 수 없습니다. 2 1 행은 2 열에 표시 결과를 가입으로외부 적용 2 행을 1 행 2 열로 결합하십시오.

내가 복수를하고 싶은

결과 디스플레이에 가입

SELECT 
    E.[EventId] 
    ,S_ID.[EventType] 
    ,null as [RootCause2] 

FROM [AOE_Workflow].[dbo].[Event] E 

    outer apply 
    (
    select * from [AOE_Workflow].[dbo].[EventTypes] S 
    WHERE E.EventID=S.EventID 
    ) S 

    outer apply 
    (
    select * from [AOE_Workflow].[dbo].[EventType] S_ID 
    WHERE S_ID.[EventTypeId]=S.[EventTypeId] 
    ) S_ID 

ORDER BY eventID desc 

enter image description here

+0

- 확실한 추가 결과가 있습니까? 구문에서 나는 이것이 SQL Server라고 가정합니다. 어떤 버전입니까? – Shnugo

+0

이것은 SSMS 2014입니다. 동일한 이벤트 ID에 대해 최대 4 개의 결과가있을 수 있습니다. –

답변

1

은, 당신의 outer apply의 간단한 LEFT JOIN의보다 쉽게 ​​지정할 수 있습니다.

을 사용하여 과 나란하게 출력을 수행 할 수 있습니다. 주어진 쿼리에는 암시 적 정렬 순서이 없습니다. 다시 말하면 무작위가 될 것인데 이것은 첫 번째이며 두 번째 (세 번째/네 번째)입니다. 내 SQL에서는 적절한 문자로 (SELECT NULL)을 변경할 때 정렬을 쉽게 제어 할 수 있습니다.

SELECT p.* 
FROM 
(
    SELECT 
     E.[EventId] 
     ,S_ID.[EventType] 
     ,'EventType_' + CAST(ROW_NUMBER() OVER(PARTITION BY E.[EventId] ORDER BY(SELECT NULL)) AS VARCHAR(1)) AS ColumnName 
    FROM [AOE_Workflow].[dbo].[Event] E 
    LEFT JOIN [AOE_Workflow].[dbo].[EventTypes] S ON E.EventID=S.EventID 
    LEFT JOIN [AOE_Workflow].[dbo].[EventType] S_ID ON S_ID.[EventTypeId]=S.[EventTypeId] 
) AS tbl 
PIVOT 
(
    MIN(EventType) FOR ColumName IN(EventType_1,EventType_2,EventType_3,EventType_4) 
) AS p 
+0

피벗이 대답이었습니다. 감사합니다! –

0

는 설계 단계에서 여전히 당신을, 아니면 당신은 기존 데이터 구조에 의해 제한됩니까?

각 이벤트 유형은 원인을 근절하는 것처럼, 자신의 기업이 될 것 같다, 즉 이벤트 유형 = '전원이'가 근본 원인으로 '만료 배터리'또는 '나쁜 발전기'가 없었다, 그래서 루트를 결합 할 것입니다 이벤트 유형이 아닌 이벤트 발생. 나는이 잘못을하지 않는 경우

CREATE TABLE Event 
(eventId int NOT NULL, 
    eventTypeId int not null, 
    rootCauseId int not null, 
    CONSTRAINT e_pk PRIMARY KEY (eventId) 
); 

CREATE TABLE EventType 
(eventTypeId int NOT NULL, 
    eventTypeDescription int not null, 
    CONSTRAINT et_pk PRIMARY KEY (eventTypeId) 
); 

CREATE TABLE EventRootCause 
(rootCauseId int NOT NULL, 
    rootCauseDescription int not null, 
    CONSTRAINT rc_pk PRIMARY KEY (rootCauseId) 
); 

select 
    e.eventId 
    ,et.EventTypeDescription as EventType 
    ,rc.rootCauseDescription as RootCause2 
from 
    Event e 
left join 
    EventType et 
     on 
      e.eventTypeId = et.EventTypeId 
left join 
    RootCause rc 
     on 
      e.rootCauseId = rc.RootCauseId 
order by e.eventId 
+0

불행히도 DBA가 아니며 기존 데이터 구조를 사용하려고하는 최종 사용자 일뿐입니다. –