/ / Лява външна база данни към същата таблица с оптимална производителност - sql, database, join, left-join

Базата данни остава външна връзка с с една и съща таблица с оптимална производителност - sql, база данни, присъединяване, left-join

Имам таблица на състоянието А с код и неговото описание, свързано с определено име.

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;

В зависимост от базата данни, съединенията може да са по-добри. Това е предимството, че можете да добавите толкова полета, колкото желаете, с еднаква производителност.