Sql 可选择加入

Sql 可选择加入,sql,oracle,oracle11g,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

我有两张桌子:

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_值:

Table1.Bus_Criteria   Table2
0                     GroupID
1                     TypeID
2                     SubGroupID
更复杂的是,如果Bus_标准中的一个或两个0/1/2值丢失,则连接仍将发生在其余标准上

我在连接上尝试了许多和/或的组合,但均无效


各位有什么想法吗?

这可能就是你们想要的。。在联接上使用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 

这可能就是你想要的。。在联接上使用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 

你试过这样的吗

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

你试过这样的吗

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

您是否尝试过左外联接?如果总线标准中的0/1/2值丢失,则联接仍将发生在其他两个标准上,这增加了复杂性。:我不明白。还有什么其他条件?可能您需要在联接上使用case语句。您是否尝试了
外部左联接
?如果缺少来自Bus_条件的0/1/2值,则联接仍将在其他2个条件上发生。我不明白。还有什么其他标准?也许您需要在连接上使用case语句。