Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带case语句的SQL连接_Sql_Sql Server_Join_Case - Fatal编程技术网

带case语句的SQL连接

带case语句的SQL连接,sql,sql-server,join,case,Sql,Sql Server,Join,Case,我有这五张桌子 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.

我有这五张桌子

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语句进行了研究,但没有希望。任何帮助都需要使用LEFT JOIN和handle with COALESCE子句来处理来自表的空值。例如,如果order_install和order_remove都可以有OrderDetailname,其中一个会根据typeId给出值

您需要将COALESCEorder\u install.OrderDetailName、order\u remove.OrderDetailName作为OrderDetailName

选择o.*-COALESCE您需要在此处使用COALESCE子句来处理来自两个表的值 从命令 左外部联接顺序\u阶段\u按订单安装。stageid=order\u阶段\u安装.id 和o.typeId=1 左外部联接顺序\u阶段\u按顺序删除。stageid=order\u阶段\u remove.id o.typeId=2
我知道一个人应该只回答一个问题。但在这种情况下,似乎最好先优化数据结构以避免连接

委婉地说,数据结构似乎不是最优的。 这会导致复杂的连接策略和许多其他问题

请解释三个订单阶段表格包含的内容以及应为您提供的服务

我的猜测是,您希望将这些订单存储在具有特定阶段的三个表中。
但这只需要在orders表上增加一个属性,以防这些阶段不相交=总是不同的,不可能一个订单有多个阶段。

正如@Venkataraman所提到的,他的解决方案解决了这个问题 下面是完整的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

不能使用大小写表达式有条件地联接不同的表。即使有些语法允许您这样做,您也可以尝试使用动态sql,这意味着对于不同行中order.typeid的不同值,您将拥有不同的列。当然,这是不可能的。这是一个常见问题。在考虑发帖之前,请先阅读您的课本和/或手册,并在谷歌上搜索任何错误消息或您的问题/问题/目标的许多清晰、简洁和准确的措辞,包括或不包括您的特定字符串/名称和网站:stackoverflow.com&tags;阅读许多答案。如果你发布一个问题,用一句话作为标题。反思你的研究。查看文本上方的投票箭头鼠标(&t)。您没有说出您想要做的事情。给出无意义的代码并不能传达你的想法。使用足够的单词、句子和引用部分例子,清楚、完整地说出你的意思。在给出业务关系/关联、表基或查询结果时,请说明其中的一行根据其列值对业务状况的说明。请在代码问题中给出a-包括剪切、粘贴和可运行的最小代码以及作为代码给出的最小代表性数据。对于包含DBMS和DDL的SQL,包括约束、索引和表格初始化。