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`
是否有這樣做的一個更聰明的方式?由於「不在」子查詢,現在添加的查詢執行速度減慢了三倍。
任何幫助非常感謝!
彼得
謝謝你的回覆迅速!我想我可能會給出一個非常糟糕的例子 - 對不起!我修改了我的原始問題以顯示我正在執行的查詢。發票表不是我加入的。 –