名前、名前、DOBなどのフィールドを含む「連絡先」のテーブルがあります。
これのSQLビューを作成しようとしています。これには、「ProspectiveNews」というフィールドも含まれています。このフィールドには、別のビューの基準の一致に応じて、基本的に4つの分類コード(または空白)のいずれかが含まれます。
連絡先は、この他のビューに異なる年レベルの多数のレコードを持つことができます。
この他のビューでは、連絡先IDは[ContactID]または[ContactSpouseID]の2つの列のいずれかに表示される可能性があります。ここで、別の列、ReferenceTable <> 'Enquiry'
次に、ReferenceTable = 'Enquiry'のレコードがいくつかあり、ContactID列には代わりにEnquiryIDが含まれているため、それを使用する必要があります。
したがって、分類コードごとに3つのチェックが行われます。
実行には約2分かかりますが、これがコードです。それが問題です-遅すぎます。これを速くするために何ができますか?
コードの概要:
連絡先に、YearLevel 0 THEN'K 'のみである別のビューからのレコードがある場合
連絡先に、YearLevel 1-6 THEN'1-6 'のみである別のビューからのレコードがある場合
連絡先が別のビューからのレコードを持っている場合、それは年レベル7-12 THEN '7-12'です。
連絡先にYearLevelsのレコードがある場合:
0および1-6
または
0および7-12
または
1-6および7-12
次に「一般」
コード:
SELECT
C.ID as ContactID,
ESC.ID as EnquiryID,
CASE WHEN ( C.ID in (SELECT [ContactID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel = 0 AND ReferenceTable <> 'Enquiry')
AND NOT EXISTS (SELECT [ContactID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel > 0 AND ReferenceTable <> 'Enquiry' AND [ContactID] = C.ID)
)
OR
( C.ID in (SELECT [ContactSpouseID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel = 0 AND ReferenceTable <> 'Enquiry')
AND NOT EXISTS (SELECT [ContactSpouseID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel > 0 AND ReferenceTable <> 'Enquiry' AND [ContactSpouseID] = C.ID)
)
OR
( ESC.ContactEnquiryID in (SELECT [ContactID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel = 0 AND ReferenceTable = 'Enquiry')
AND NOT EXISTS (SELECT [ContactID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel > 0 AND ReferenceTable = 'Enquiry' AND [ContactID] = C.ID)
)
THEN 'K'
ELSE
CASE WHEN ( C.ID in (SELECT [ContactID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel > 0 AND YearLevel < 7 AND ReferenceTable <> 'Enquiry')
AND NOT EXISTS (SELECT [ContactID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel = 0 AND ReferenceTable <> 'Enquiry' AND [ContactID] = C.ID)
AND NOT EXISTS (SELECT [ContactID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel > 6 AND ReferenceTable <> 'Enquiry' AND [ContactID] = C.ID)
)
OR
( C.ID in (SELECT [ContactSpouseID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel > 0 AND YearLevel < 7 AND ReferenceTable <> 'Enquiry')
AND NOT EXISTS (SELECT [ContactSpouseID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel = 0 AND ReferenceTable <> 'Enquiry' AND [ContactSpouseID] = C.ID)
AND NOT EXISTS (SELECT [ContactSpouseID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel > 6 AND ReferenceTable <> 'Enquiry' AND [ContactSpouseID] = C.ID)
)
OR
( ESC.ContactEnquiryID in (SELECT [ContactID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel > 0 AND YearLevel < 7 AND ReferenceTable = 'Enquiry')
AND NOT EXISTS (SELECT [ContactID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel = 0 AND ReferenceTable = 'Enquiry' AND [ContactID] = C.ID)
AND NOT EXISTS (SELECT [ContactID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel > 6 AND ReferenceTable = 'Enquiry' AND [ContactID] = C.ID)
)
THEN '1-6'
ELSE
CASE WHEN ( C.ID in (SELECT [ContactID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel > 6 AND YearLevel < 13 AND ReferenceTable <> 'Enquiry')
AND NOT EXISTS (SELECT [ContactID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel < 7 AND ReferenceTable <> 'Enquiry' AND [ContactID] = C.ID)
)
OR
( C.ID in (SELECT [ContactSpouseID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel > 6 AND YearLevel < 13 AND ReferenceTable <> 'Enquiry')
AND NOT EXISTS (SELECT [ContactSpouseID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel < 7 AND ReferenceTable <> 'Enquiry' AND [ContactSpouseID] = C.ID)
)
OR
( ESC.ContactEnquiryID in (SELECT [ContactSpouseID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel > 6 AND YearLevel < 13 AND ReferenceTable = 'Enquiry')
AND NOT EXISTS (SELECT [ContactSpouseID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel < 7 AND ReferenceTable = 'Enquiry' AND [ContactID] = C.ID)
)
THEN '7-6'
ELSE
CASE WHEN ( C.ID in (SELECT [ContactID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND ReferenceTable <> 'Enquiry')
)
OR
( C.ID in (SELECT [ContactSpouseID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND ReferenceTable <> 'Enquiry')
)
OR
( ESC.ContactEnquiryID in (SELECT [ContactID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND ReferenceTable = 'Enquiry')
)
THEN 'General'
ELSE '' END END
END
END AS ProspectiveNews
@UV
ありがとう:パフォーマンスが遅いのは、[表]から何度も選択しているためです。代わりに、[テーブル]の候補リストを結合し、場合によっては集計し、結合されたフィールドを使用してユースケースを作成します。時間があれば、後で例を書きます。メインテーブルを参照するために参加する必要がある場合は、OUTER APPLYを使用することをお勧めします。ItzikBen-Ganからの良い投稿があります。または、こちらをご覧ください:sqlbits.com/Sessions/Event14/…– UV
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加