SQL Присоединиться с помощью оператора case - PullRequest
0 голосов
/ 18 июня 2020

у меня есть эти пять таблиц

order_type(id,name)
order_stage_install(id,name)
order_stage_remove(id,name)
order_stage_redo(id,name)
orders(id,typeid,stageid)

мне нужно динамически присоединиться к таблице заказов с этим условием

    if order.typeid=1 
then join order_stage_install on order.stageid=order_stage_install.id
    if order.typeid=2 
then join order_stage_remove on order.stageid=order_stage_remove.id

Я пробовал это

    SELECT  *
FROM  orders o
            CASE 
            WHEN o.Type IN (1) THEN
             JOIN orders_stage os ON o.stageID=os.ID
            end

, но это дает мне неправильный синтаксис рядом с ошибкой CASE. Я провел исследование операторов case и операторов if в sql, но безнадежно. любая помощь приветствуется

Ответы [ 3 ]

1 голос
/ 18 июня 2020

, как упоминал @Venkataraman_R, его решение решило проблему, вот полный sql статус

SELECT  
COALESCE(osn.enum,osr.enum,osre.enum) as 'Current Stage',
COALESCE(oen.enum,oer.enum,oere.enum) as 'Current Phase',ot.enum as 'Order Type',
o.ID,scheduled_date as 'Scheduled'
  ,opened_date as 'Opened'
FROM  orders o
LEFT OUTER JOIN orders_types ot ON o.Type = ot.ID

LEFT OUTER join orders_stage osn  on o.stageID=osn.ID
AND o.Type = 1
LEFT OUTER JOIN orders_stage_removal osr  on o.stageID=osr.ID
AND o.Type = 2
LEFT OUTER JOIN orders_stage_redo osre  on o.stageID=osre.ID
AND o.Type = 3

LEFT OUTER join orders_enum_install oen  on o.enumID=oen.ID
AND o.Type = 1
LEFT OUTER JOIN orders_enum_removal oer  on o.enumID=oer.ID
AND o.Type = 2
LEFT OUTER JOIN orders_enum_redo oere  on o.enumID=oere.ID
AND o.Type = 3
0 голосов
/ 18 июня 2020

Я знаю, что нужно отвечать только на вопрос. Но в этом случае, кажется, лучше сначала оптимизировать структуру данных, чтобы вообще избежать JOIN.

Структура данных кажется неоптимальной, мягко говоря. Это впоследствии приводит к сложным стратегиям JOIN и множеству других проблем.

Пожалуйста, объясните, что три таблицы order_stage_ * - содержат и должны делать для вас.

Я предполагаю, что вы хотите сохранить те заказы в тех трех таблицах, которые имеют специфику c stage. Но это необходимо сделать с помощью всего лишь одного дополнительного атрибута в таблице заказов, в случае, если эти этапы не связаны (= всегда разные, невозможно, чтобы один заказ состоял из нескольких этапов).

0 голосов
/ 18 июня 2020

Вам необходимо использовать LEFT JOIN и обработать с предложением COALESCE для обработки значений NULL, поступающих из таблиц. Например, если и order_install, и order_remove могут иметь OrderDetailname, и один из них будет давать значения на основе typeId.

У вас должно быть COALESCE(order_install.OrderDetailName, order_remove.OrderDetailName) AS OrderDetailName


SELECT  o.*, -- COALESCE( You need to have COALESCE clause here to handle values coming from both tables
FROM  orders o
LEFT OUTER join order_stage_install on order.stageid=order_stage_install.id
AND o.typeId = 1
LEFT OUTER JOIN order_stage_remove  on order.stageid=order_stage_remove.id
AND o.typeId = 2
...