2016-06-08 4 views
0

Я пытаюсь написать запрос, который объединяет несколько результатов Outer Apply join в отдельные строки данных. Я играл с некоторыми 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 результатов для того же eventID –

ответ

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

Вы все еще в стадии разработки, или вы ограниченная существующей структурой данных?

Каждый тип события, казалось бы, его собственное лицо, как это первопричина, т.е. EventType = «Никакая сила» не может иметь «истекла батареи» или «плохой генератор» в качестве первопричины, , так что вы бы присоединиться корень вызывайте событие, а не тип события.

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

К сожалению, я не являюсь администратором баз данных, только конечный пользователь пытается работать с существующей структурой данных. –