2017-05-31 55 views
0

我有一个SQL查询,我想优化。我不是数据库的设计者,所以我无法改变结构,索引或存储过程。使用JOIN优化SQL查询而不是NOT IN

我有一张由发票组成的表(称为faktura),每张发票都有一个唯一的发票编号。如果我们必须取消发票,则会在同一个表中创建一个辅助发票,但是会创建一个引用原始发票ID的字段(“modpartfakturaid”)。 faktura表

例子:

invoice 1: Id=152549, modpartfakturaid=null 

invoice 2: Id=152592, modpartfakturaid=152549 

我们也称为表“BHLFORLINIE”,下设呈现给客户的服务。部分服务已经开具发票并与发票(FAKTURA)表中的记录相匹配。

我想要做的是获得所有没有发票或没有已取消发票的服务列表。

我现在正在做的是:

`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` 

是否有这样做的一个更聪明的方式?由于“不在”子查询,现在添加的查询执行速度减慢了三倍。

任何帮助非常感谢!

彼得

回答

0

您可以使用外连接和检查空值找到匹配的非

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

谢谢你的回复迅速!我想我可能会给出一个非常糟糕的例子 - 对不起!我修改了我的原始问题以显示我正在执行的查询。发票表不是我加入的。 –