2016-06-08 45 views
0

我正在嘗試編寫一個將多個外部應用連接結果合併到單個數據行的查詢。我曾經玩過一些CTE,但我無法將頭圍繞解決方案。Outer Apply將2行合併爲1行和2列

我想有多個連接結果顯示爲1行與第2參加在第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.最多可以有4個結果,對於同一個事件ID –

回答

1

如果我沒有得到這個錯誤,你outer apply s時,可以更容易地用簡單的LEFT JOIN秒爲單位指定。

並排輸出可以用PIVOT完成。使用給定的查詢有無隱式排序順序。這意味着,這將是隨機的,這是第一,這是第二(和第三/第四)。在我的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

Pivot是答案,謝謝! –

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,只是嘗試使用現有數據結構的最終用戶 –