无法通过LEFT JOIN检索精确结果

时间:2014-12-18 09:55:15

标签: sql join left-join

我有三个具有以下结构的表:

用户表

UserID  Name  Age
------  ----  ---
   001    AA   23
   002    BB   25
   003    CC   30
   004    DD   24
   005    EE   23

temp_User表

UserID  Name  Age
------  ----  ---
   001    AA   23
   002    BB   25
   004    DD   24
   005    EE   23
   007    GG   23
   009    HH   28

ExceptionUsers表

UserID  Status
------  --------
   021    Active
   002  Inactive
   004    Active
   010    Active
   012  Inactive

我使用以下查询来检索我的结果:

查询

select
     A.Name
    ,B.Name
    ,A.Age
    ,B.Age
from User A 
inner join temp_User B
    on A.UserID = B.UserID
left join ExceptionUsers C
    on A.UserID = C.UserID
    and C.Status = 'Inactive'
order by
    A.Name

结果

001  AA  23
002  BB  25
005  EE  23

但结果包括“活跃”的用户。

001  AA  23
002  BB  25
004  DD  24
005  EE  23

如何尝试查询以获取结果?

4 个答案:

答案 0 :(得分:1)

将C.Status ='Inactive'移至where子句。

答案 1 :(得分:0)

Left join不会过滤加入条件时提供的数据。

因此,您可以将加入条件and C.Status = 'Inactive'移至where子句,并将其视为inner join

select A.Name, B.Name, A.Age, B.Age
from User A 
inner join temp_User B
on A.UserID = B.UserID
left join ExceptionUsers C
on A.UserID = C.UserID
where
C.Status = 'Inactive'
order by A.Name

答案 2 :(得分:0)

您可以使用以下查询获取活动用户的详细信息列表。

select * from temp_User where UserID in (select UserID from ExceptionUsers where Status = 'Inactive')

答案 3 :(得分:0)

我将LEFT JOIN逻辑移动到WHERE子句,转移到NOT EXISTS。

select A.Name, B.Name, A.Age, B.Age
from User A 
inner join temp_User B
on A.UserID = B.UserID
where not exists (select * from ExceptionUsers C
                  where A.UserID = C.UserID
                  and C.Status = 'active')
order by A.Name