SQL:连接表a和b然后连接表c以获取结果但不在c上?

时间:2016-01-26 00:04:56

标签: sql sql-server join

我有3张桌子。表a pk = userid,表b和c fk = userid。在表b上,RoleID列等于表c中的Usermanager列,但是为新值。
所以我加入了表a和b以下查询

select a.Username, a.Userid, b.Roleid
from NewTable a
join RoleTable b
    on a.UserID=b.UserID
where b.RoleID = 2

这会产生502条记录。

表c查询

select *
from OldTable
where UserManager = 1
    and Authorized = 1
    and Status = 'A'

这导致500条记录。

所以我正在尝试加入2个查询来查找不在表c上但仅在表a上的2条记录。

感谢。

4 个答案:

答案 0 :(得分:0)

您可以使用左连接

执行此操作
select subA.*
from (
    select a.Username, a.Userid, b.Roleid
    from NewTable a
    join RoleTable b
        on a.UserID=b.UserID
    where b.RoleID = 2
) subA
left join (
    select userID
    from OldTable
    where UserManager = 1
        and Authorized = 1
        and Status = 'A'
) subB
on subA.Userid = subB.UserID
Where subB.userid is null

答案 1 :(得分:0)

这样的事情应该可以解决问题。您可以计算出数据库的详细信息。

select fields
from tableA join tableB on something
where whatever
and tableA.someField in 
(select someField
from tableA join tableB on something
where whatever

except 
select someEquivalentField
from tableC)

两个where whatevers应该是相同的。

答案 2 :(得分:0)

如果我正确理解你的问题......下面将加入表A和表C,然后找到那些在表C中没有相应值的那些

Select * from Table A A
LEFT JOIN Table C C On A.UserId = C.UserId
Where C.UserId is NULL

这是基本概念..你需要努力使语法符合你的动机

答案 3 :(得分:0)

试试这个:

select a.Username, a.Userid, b.Roleid 
from NewTable a 
join RoleTable b 
on a.UserID=b.UserID 
where 
    b.RoleID = 2
    AND
    NOT EXISTS
        (select * 
        from OldTable AS c
        where c.UserManager = 1 
            and 
            c.Authorized = 1 
            and 
            c.Status = 'A'
            AND
            a.userid = c.userid)

我使用了您提到的两个查询,并将表c查询转换为WHERE NOT EXISTS子查询。它应该提供您正在寻找的那两个结果。