Имам таблица на състоянието А с код и неговото описание, свързано с определено име.
Code Desc Name
01 INITIAL STATUS_A
02 SUCCESS STATUS_A
03 FAILED STATUS_A
04 FAILED STATUS_B
05 RETRY STATUS_C
06 SUCESS STATUS_D
и така нататък... Сега имам таблица Б като главен запис с код асоцииран от таблица А.
ID column1 column2 column3 statusA statusB statusC statusD
432 XXXX YYYY ZZZZ 03 04 05 06
Сега трябва да създам заявка за получаване на изходни данни с описание на код от таблица А.
Направих това с помощта на лявото външно присъединяване. Може ли някой да предложи по-добро решение.
Лява външна заявка за присъединяване
Select b.column1 ,b.column2,
a1.Desc as Status_A_Desc ,
a2.Desc as Status_B_Desc,
a3.Desc as Status_C_Desc,
a4.Desc as Status_D_Desc
from B b left outer join
A a1 on a1.code = b.statusA and a1.Name ="STATUS_A"
left outer join
A a2 on a2.code = b.statusB and a2.Name ="STATUS_B"
left outer join
A a3 on a3.code = b.statusC and a3.Name ="STATUS_C"
left outer join
A a4 on a4.code = b.statusD and a4.Name ="STATUS_D"
where b.ID = 432
Отговори:
0 за отговор № 1Вместо това можете да използвате условното агрегиране:
select a.code,
max(case when a.name = "Status_A" then a.desc end) as a,
max(case when a.name = "Status_B" then a.desc end) as b,
max(case when a.name = "Status_C" then a.desc end) as c,
max(case when a.name = "Status_D" then a.desc end) as d
from a
group by a.code;
В зависимост от базата данни, съединенията може да са по-добри. Това е предимството, че можете да добавите толкова полета, колкото желаете, с еднаква производителност.