调整内部联接

时间:2013-01-16 09:29:02

标签: sql join conditional-statements

我有一个如下构建的数据库: 非活动表 - 包括所有已删除\非活动用户 活动表 - 包括所有当前活动的用户 主表 - 包括所有用户(活动和非活动)

所有三个表中存在一些字段(例如userName),我想从非活动表或活动表中获取数据(因为所有表中的数据并不总是相等),所以我希望有一个连接,它将来自Active表或Inactive表(根据主表中的ActiveState字段)

我的查询非常复杂,但为了简化它,我有一个小例子来解释我的问题:

SELECT M.ID,
       A.userName
FROM   MainTbl M

IF M.ActiveState = 'Active'
   THEN 
   INNER JOIN ActiveTbl A ON A.UserID = M.ID
ELSE
    INNER JOIN InactiveTbl A ON A.UserID = M.ID
END
    INNER JOIN SomeTbl S ON S.Field = A.Field

注意: 对于我使用A的两个表,原因是我将此表用于select本身以及更多内部联接

有没有办法这样做?

由于

2 个答案:

答案 0 :(得分:0)

使用LEFT JOIN代替INNER JOIN,然后使用以下内容:

SELECT CASE WHEN A.ID IS NULL 
            THEN I.userName
            ELSE ActiveTbl.userName 
       END AS userName
FROM   MainTbl M
       LEFT JOIN ActiveTbl A 
                 ON A.UserID = M.ID 
                 AND m.ActiveState = 'Active'
       LEFT JOIN InactiveTbl I
                 ON I.UserID = M.ID

答案 1 :(得分:0)

SELECT CASE M.ActiveState
            WHEN 'Active' THEN A.userName
            ELSE I.userName
       END AS userName
FROM   MainTbl M
       LEFT JOIN ActiveTbl A
            ON  A.UserID = M.ID
       LEFT JOIN InactiveTbl I
            ON  I.UserID = M.ID