我有三个表,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
问题是我得到了客户的所有账单,无论它们是否可以修改。
我试图进行正确的联接,但是在这种情况下,我没有得到任何结果。
联接是否可能,或者我需要一些子查询?我希望有一个带有联接的解决方案,但是如果没有这种方法,我会接受另一个解决方案。
答案 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