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`
是否有这样做的一个更聪明的方式?由于“不在”子查询,现在添加的查询执行速度减慢了三倍。
任何帮助非常感谢!
彼得
谢谢你的回复迅速!我想我可能会给出一个非常糟糕的例子 - 对不起!我修改了我的原始问题以显示我正在执行的查询。发票表不是我加入的。 –