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