2017-05-31 11 views
0

私は最適化したいSQLクエリを持っています。私はデータベースのデザイナーではないので、構造、インデックス、またはストアドプロシージャを変更する方法はありません。NOT INではなくJOINを使用してSQLクエリを最適化する

私は、請求書(fakturaと呼ばれる)から成るテーブルを持ち、各請求書には一意の請求書IDがあります。請求書を取り消す必要がある場合、元の請求書IDを参照する項目(「modpartfakturaid」)を使用して、同じ表に2次請求書が作成されます。 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` 

は、これを行うのよりスマートな方法はありますか?今すぐ追加されたクエリは、 "in in"サブクエリのために3倍遅く実行されます。

ご協力いただきありがとうございます。

ピーター

答えて

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

迅速な返信いただきありがとうございますを見つけるために、null値をチェック!私は本当に悪い例を与えたかもしれないと思う - ごめんなさい!元の質問を変更して、自分が行っているクエリを表示しました。請求書テーブルは、私が参加しているテーブルではありません。 –

関連する問題