加入可选

时间:2016-09-08 13:48:38

标签: sql oracle oracle11g

我有两张桌子:

Table1 - Criteria
Office_ID  Bus_Stream  Bus_Criteria  Crit_Value
1          ABC         0             20
1          ABC         1             21
1          ABC         2             7
2          ABC         0             15
2          ABC         1             12
2          ABC         2             21
3          XYZ         1             17
3          XYZ         2             3


Table2 - Limit
Bus_Stream  GroupID  TypeID  SubgroupID  Bus_Limit
ABC         20       21      7           50
ABC         15       12      21          100
XYZ         99       17      3           120

我需要创建一个允许我退回的联接:

Result
Bus_Stream  Office_ID  GroupID  TypeID  SubgroupID  Bus_Limit
ABC         1          20       21      7           50
ABC         2          15       12      21          100
XYZ         3          (null)   17      3           120

基本上,我需要根据以下内容加入Table1.Crit_Value:

Table1.Bus_Criteria   Table2
0                     GroupID
1                     TypeID
2                     SubGroupID

增加了复杂性,如果缺少Bus_Criteria中的一个或两个0/1/2值,则仍然会在其余条件上进行连接。

我在连接上尝试了多种AND / OR组合无效。

任何想法的人?

2 个答案:

答案 0 :(得分:3)

这可能就是你所追求的......在连接上使用case语句。

这里的问题是你的t2中的数据没有标准化,你也可以在t2中取消3个数据列的连接,这样连接就更自然了。

SELECT T2.Bus_Stream, T1.Office_ID, T2.GroupID, T2.TypeID, T2.SubGroupId, T2.bus_Limit
FROM T1
INNER JOIN T2
 on T1.Bus_Stream = T2.Bus_Stream
and T1.Crit_value = case when T1.Bus_Critiera = 0 then T2.GroupID
                         when T1.Bus_Critiera = 1 then T2.TypeID
                         when T1.Bus_Critiera = 2 then T2.SubGroupID
                    end 

答案 1 :(得分:1)

你试过这样的事吗?

SELECT
t1.*, t2.*
FROM Table1 t1
INNER JOIN Table2 t2 ON 
    t1.Bus_Stream = t2.Bus_Stream AND
    CASE
        WHEN t1.Bus_Criteria = 0 
            THEN t2.GroupID = t1.Crit_Value
        WHEN t1.Bus_Criteria = 1
            THEN t2.TypeID = t1.Crit_Value
        ELSE 
            t2.SubGroupID = t1.Crit_Value
    END