是否可以过滤左联接?

时间:2018-09-13 11:46:30

标签: sql sql-server tsql join

我有三个表,Clients,Bills和BillsStates。我一直希望得到客户,如果有帐单,则只能修改帐单。我正在尝试类似的东西:

select * from Clients
left join Bills on Bills.IDClient = Clients.IDClient
left join BillsStates on BillsStates.IDBillState = Bills.IDState
and BillsStates.AllowModify = 1

问题是我得到了客户的所有账单,无论它们是否可以修改。

我试图进行正确的联接,但是在这种情况下,我没有得到任何结果。

联接是否可能,或者我需要一些子查询?我希望有一个带有联接的解决方案,但是如果没有这种方法,我会接受另一个解决方案。

4 个答案:

答案 0 :(得分:3)

select * from Clients
left join Bills
    inner join BillsStates on BillsStates.IDBillState = Bills.IDState
on Bills.IDClient = Clients.IDClient
and BillsStates.AllowModify = 1

您遇到的问题是,仅使BillsStates记录被排除,因为过滤器仅处于连接状态。相反,您可以重新排序并将其移至Bills的加入条件中。

答案 1 :(得分:1)

您的查询仅将V条件失败的空值替换为BillsStates.*

BillsStates.AllowModify = 1

重新排列联接类型和条件以获得所需的结果:

| IDClient | Name | IDClient | IDState | Name   | IDBillState | AllowModify |
|----------|------|----------|---------|--------|-------------|-------------|
| 1        | John | 1        | 1       | Bill 1 | NULL        | NULL        |
| 1        | John | 1        | 2       | Bill 2 | 2           | 1           |
| 2        | Jane | NULL     | NULL    | NULL   | NULL        | NULL        |
SELECT *
FROM Clients
LEFT JOIN (Bills
INNER JOIN BillsStates ON BillsStates.IDBillState = Bills.IDState) ON Bills.IDClient = Clients.IDClient AND BillsStates.AllowModify = 1;

答案 2 :(得分:1)

您可以尝试一下。

select * from Clients
    left join 
        ( select * from Bills 
            inner join BillsStates on BillsStates.IDBillState = Bills.IDState
                and BillsStates.AllowModify = 1
        ) B ON  B.IDClient = Clients.IDClient

答案 3 :(得分:0)

在bills和BillsStates之间使用内部联接,而不是左联接,并与客户端进行左联接

select c.* from Clients c
left join Bills b on b.IDClient = c.IDClient
inner join BillsStates bs 
on bs.IDBillState = b.IDState  and   b.AllowModify = 1