连接四个表的SQL查询

By simon at 2018-02-07 • 0人收藏 • 38人看过

原始查询是加入客户表和合同表和额外服务 历史,这一切工作。 不过我有麻烦添加第四个表格,应该进一步应用一些 标准。 当前工作查询(不需要更改):

select b.*
from SubscribersFIN b

inner join (select Id, Account_Number, ContractNumber, BackendId
from Contract) e on b.c_id='FI_' + e.Account_Number

left join (select Contract
from Extra_Service_History
where Service_Name='debit_plan') d on e.Id=d.Contract

where COUNTRY='fi' 
and NO_SMS = 0
and d.Contract is null
目标是筛选来自只记录该查询的大查询的集合 在发票中显示付费状态。
right join (select Contract 
from Invoice
where Status = 'PAID') i on e.Id=i.Contract
这一个是似乎没有办法,所以我无法弄清楚什么 在这里需要一些连接类型或逻辑。

3 个回复 | 最后更新于 2018-02-07
2018-02-07   #1

而不是混合左和右连接,只要把它作为一个INNER连接更高 在你的查询中:

select b.*
from SubscribersFIN b

inner join (select Id, Account_Number, ContractNumber, BackendId
from Contract) e on b.c_id='FI_' + e.Account_Number

inner join (select Contract 
from Invoice
where Status = 'PAID') i on e.Id=i.Contract

left join (select Contract
from Extra_Service_History
where Service_Name='debit_plan') d on e.Id=d.Contract

where COUNTRY='fi' 
and NO_SMS = 0
and d.Contract is null

2018-02-07   #2

基于我的理解,我只是重新安排了查询。尝试这个。如果你的 条件栏来自任何LEFT JOIN表,加入他们 在on条款。

select b.* from SubscribersFIN b
inner join Contract e  on b.c_id='FI_' + e.Account_Number
left join  Extra_Service_History d on e.Id=d.Contract and d.Service_Name='debit_plan' and d.Contract is null
left join invoice i on e.Id=i.Contract and i.Status = 'PAID'
where COUNTRY='fi'  and NO_SMS = 0

2018-02-07   #3

你有几个选择:   1. 内部连接 根据外部连接的特定类型,它们返回没有的行 比赛是f(连接的左侧,右侧或两侧)。根据你的 描述这不是你想要的。只需使用:

inner join (select Contract 
from Invoice
where Status = 'PAID') i on e.Id=i.Contract
在FROM子句中发生这种情况应该没有关系;提供了加入 这两张桌子之间是INNER。查询引擎可以自由重新排列 性能提供它不会改变语义。 (但是我亲自找到它 整理内部联接在顶部。)   2. * IN过滤器* 你所描述的是一个过滤器。

目标是过滤来自大查询的集合只有记录 在发票中显示付费状态。 因此,将其作为WHERE子句中的过滤器来实现将会更加清晰。 E.G。

where e.Id in (select  Contract 
               from    Invoice
               where   Status = 'PAID')
  and ...
  3. ** EXISTS过滤器 与上面类似,但使用EXISTS子查询。
where exists (select  *
              from    Invoice i
              where   Status = 'PAID'
                  and i.Contract = e.Id)
  and ...

登录后方可回帖

Loading...