sql join with case语句

yacmzcpb  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(439)

我有这五张table

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

我需要用这些条件动态地联接orders表

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’错误,我对sql中的case语句和if语句进行了研究,但没有希望。谢谢你的帮助

x759pob2

x759pob21#

正如@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
u0sqgete

u0sqgete2#

我知道一个人应该只回答一个问题。但在这种情况下,似乎最好先优化数据结构以避免连接。
温和地说,数据结构似乎不是最优的。这导致了复杂的连接策略和许多其他问题。
请解释三个订单表包含的内容,以及它们应该为您做些什么。
我的猜测是,您希望将这些订单存储在具有特定阶段的三个表中。但这只需要在表orders上添加一个属性,以防那些阶段是不相交的(=总是不同的,不可能一个顺序有多个阶段)。

vulvrdjw

vulvrdjw3#

您需要使用left join和handle with coalesce子句来处理来自表的空值。e、 g,如果order\u install和order\u 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

相关问题