2017-05-31 49 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

謝謝你的回覆迅速!我想我可能會給出一個非常糟糕的例子 - 對不起!我修改了我的原始問題以顯示我正在執行的查詢。發票表不是我加入的。 –