2016-06-08 66 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,只是尝试使用现有数据结构的最终用户 –