首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用JOIN而不是NOT IN优化SQL查询

使用JOIN而不是NOT IN优化SQL查询
EN

Stack Overflow用户
提问于 2017-06-01 00:07:27
回答 1查看 33关注 0票数 0

我有一个想要优化的sql查询。我不是数据库的设计者,所以我没有办法改变结构、索引或存储过程。

我有一个由发票(称为faktura)组成的表,每个发票都有一个唯一的发票id。如果我们必须取消发票,则在同一个表中创建一个辅助发票,但其中包含一个引用原始发票id的字段("modpartfakturaid")。

faktura表示例:

代码语言:javascript
复制
invoice 1: Id=152549, modpartfakturaid=null

invoice 2: Id=152592, modpartfakturaid=152549

我们还有一个名为"BHLFORLINIE“的表,其中包含提供给客户的服务。某些服务已经开票,并且与发票(FAKTURA)表中的记录相匹配。

我想要做的是获得所有服务的列表,这些服务要么还没有发票,要么没有已经取消的发票。

我现在要做的是:

代码语言:javascript
复制
`SELECT
    dbo.BHLFORLINIE.LeveringsDato AS treatmentDate,
    dbo.PatientView.Navn AS patientName,
    dbo.PatientView.CPRNR AS patientCPR
FROM
    dbo.BHLFORLINIE
INNER JOIN dbo.BHLFORLOEB 
    ON dbo.BHLFORLOEB.BhlForloebID = dbo.BHLFORLINIE.BhlForloebID
INNER JOIN dbo.PatientView 
    ON dbo.PatientView.PersonID = dbo.BHLFORLOEB.PersonID
INNER JOIN dbo.HENVISNING 
    ON dbo.HENVISNING.BhlForloebID = dbo.BHLFORLOEB.BhlForloebID
LEFT JOIN dbo.FAKTURA 
    ON dbo.BHLFORLINIE.FakturaId = FAKTURA.FakturaId
WHERE
    (dbo.BHLFORLINIE.LeveringsDato >= '2017-01-01' OR dbo.BHLFORLINIE.FakturaId IS NULL) AND
    dbo.BHLFORLINIE.ProduktNr IN (110,111,112,113,8050,4001,4002,4003,4004,4005,4006,4007,4008,4009,6001,6002,6003,6004,6005,6006,6007,6008,7001,7002,7003,7004,7005,7006,7007,7008) AND
    ((dbo.FAKTURA.FakturaType = 0 AND 
      dbo.FAKTURA.FakturaID NOT IN (
      SELECT FAKTURA.ModpartFakturaID FROM FAKTURA WHERE FAKTURA.ModpartFakturaID IS NOT NULL
      )) OR 
    dbo.FAKTURA.FakturaType IS NULL) 
 GROUP BY
    dbo.PatientView.CPRNR,
    dbo.PatientView.Navn,
    dbo.BHLFORLINIE.LeveringsDato`

有没有更聪明的方法呢?现在,由于"not in“子查询,添加的查询执行速度慢了三倍。

任何帮助都是非常感谢的!

彼得

EN

回答 1

Stack Overflow用户

发布于 2017-06-01 00:14:42

您可以使用外连接并检查NULL值来查找不匹配项

代码语言:javascript
复制
SELECT customer.name, invoice.id 
FROM invoices i
INNER JOIN customer ON i.customerId = customer.customerId 
LEFT OUTER JOIN invoices i2 ON i.invoiceId = i2.cancelInvoiceId
WHERE i2.invoiceId IS NULL
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44289670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档