我有这五张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语句进行了研究,但没有希望。谢谢你的帮助
3条答案
按热度按时间x759pob21#
正如@venkataraman\r所提到的,他的解决方案解决了这里的问题,即完整的sql语句
u0sqgete2#
我知道一个人应该只回答一个问题。但在这种情况下,似乎最好先优化数据结构以避免连接。
温和地说,数据结构似乎不是最优的。这导致了复杂的连接策略和许多其他问题。
请解释三个订单表包含的内容,以及它们应该为您做些什么。
我的猜测是,您希望将这些订单存储在具有特定阶段的三个表中。但这只需要在表orders上添加一个属性,以防那些阶段是不相交的(=总是不同的,不可能一个顺序有多个阶段)。
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