をこの遅いネストされたSQLケースクエリを作成するにはどうすればDOBなど私も含まれ、こののSQLビューを作成しようとしていますが速く
を名前、姓、などの分野を含んでいる[連絡先]のテーブルを持っていますフィールドは「ProspectiveNews」と呼ばれます。このフィールドには、基本的に4つの分類コード(または空白)のうちの1つが含まれます。
連絡先には、別のYearLevelsを持つこの別のビューに多数のレコードを含めることができます。 [ContactID]または[ContactSpouseID]別の列、ReferenceTable <>「お問い合わせ」
は、その後いくつかのレコードReferenceTable =「お問い合わせがあります。ここで
この他のビューでは、連絡先IDは、2つの列のいずれかで表示される可能性'ここで、ContactID列にEnquiryIDが含まれているため、それを使用する必要があります。
したがって、3は各分類コードをチェックします。
は実行に約2分かかりますが、コードはここにあります。それは問題です。遅すぎます。これを早くするにはどうすればよいですか?
コードの要約:
問い合わせは(ある)である別のビューからレコードを持っている場合のみYearLevel 0 THEN 'K'
連絡先は、別のレコードを持っている場合連絡先レコード(複数可)(ある)である別のビューを形成している場合は(ある)のみYearLevel 1-6 THEN '1-6'
で見るYearLevel 7-12 THEN '7-12'
IF連絡先にYearLevelsにあるレコードがあります:
0 AND 1-6
OR
0 AND 7-12
OR
1-6と7-12
THEN '一般'
コード:
エンジンは驚異を行う必要があり、これらのサブクエリを最適化することができるようにインデックスを作成SELECT
C.ID as ContactID,
ESC.ID as EnquiryID,
CASE WHEN \t (\t C.ID in \t \t (SELECT [ContactID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel = 0 AND ReferenceTable <> 'Enquiry')
\t \t \t AND NOT EXISTS \t (SELECT [ContactID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel > 0 AND ReferenceTable <> 'Enquiry' AND [ContactID] = C.ID)
\t \t \t)
\t \t \t OR
\t \t \t (\t C.ID in \t \t (SELECT [ContactSpouseID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel = 0 AND ReferenceTable <> 'Enquiry')
\t \t \t AND NOT EXISTS \t (SELECT [ContactSpouseID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel > 0 AND ReferenceTable <> 'Enquiry' AND [ContactSpouseID] = C.ID)
\t \t \t)
\t \t \t OR
\t \t \t (\t ESC.ContactEnquiryID in \t \t (SELECT [ContactID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel = 0 AND ReferenceTable = 'Enquiry')
\t \t \t AND NOT EXISTS (SELECT [ContactID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel > 0 AND ReferenceTable = 'Enquiry' AND [ContactID] = C.ID)
\t \t \t)
THEN 'K'
ELSE
CASE WHEN \t (\t C.ID in \t \t (SELECT [ContactID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel > 0 AND YearLevel < 7 AND ReferenceTable <> 'Enquiry')
\t \t \t AND NOT EXISTS \t (SELECT [ContactID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel = 0 AND ReferenceTable <> 'Enquiry' AND [ContactID] = C.ID)
\t \t \t AND NOT EXISTS \t (SELECT [ContactID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel > 6 AND ReferenceTable <> 'Enquiry' AND [ContactID] = C.ID)
\t \t \t)
\t \t \t OR
\t \t \t (\t C.ID in \t \t (SELECT [ContactSpouseID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel > 0 AND YearLevel < 7 AND ReferenceTable <> 'Enquiry')
\t \t \t AND NOT EXISTS \t (SELECT [ContactSpouseID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel = 0 AND ReferenceTable <> 'Enquiry' AND [ContactSpouseID] = C.ID)
\t \t \t AND NOT EXISTS \t (SELECT [ContactSpouseID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel > 6 AND ReferenceTable <> 'Enquiry' AND [ContactSpouseID] = C.ID)
\t \t \t)
\t \t \t OR
\t \t \t (\t ESC.ContactEnquiryID in \t \t (SELECT [ContactID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel > 0 AND YearLevel < 7 AND ReferenceTable = 'Enquiry')
\t \t \t AND NOT EXISTS \t (SELECT [ContactID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel = 0 AND ReferenceTable = 'Enquiry' AND [ContactID] = C.ID)
\t \t \t AND NOT EXISTS \t (SELECT [ContactID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel > 6 AND ReferenceTable = 'Enquiry' AND [ContactID] = C.ID)
\t \t \t)
\t \t \t
THEN '1-6'
ELSE
CASE WHEN \t (\t C.ID in \t \t (SELECT [ContactID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel > 6 AND YearLevel < 13 AND ReferenceTable <> 'Enquiry')
\t \t \t AND NOT EXISTS \t (SELECT [ContactID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel < 7 AND ReferenceTable <> 'Enquiry' AND [ContactID] = C.ID)
\t \t \t)
\t \t \t OR
\t \t \t (\t C.ID in \t \t (SELECT [ContactSpouseID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel > 6 AND YearLevel < 13 AND ReferenceTable <> 'Enquiry')
\t \t \t AND NOT EXISTS \t (SELECT [ContactSpouseID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel < 7 AND ReferenceTable <> 'Enquiry' AND [ContactSpouseID] = C.ID)
\t \t \t)
\t \t \t OR
\t \t \t (\t ESC.ContactEnquiryID in \t \t (SELECT [ContactSpouseID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel > 6 AND YearLevel < 13 AND ReferenceTable = 'Enquiry')
\t \t \t AND NOT EXISTS \t (SELECT [ContactSpouseID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND YearLevel < 7 AND ReferenceTable = 'Enquiry' AND [ContactID] = C.ID)
\t \t \t)
THEN '7-6'
ELSE
CASE WHEN \t (\t C.ID in \t \t (SELECT [ContactID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND ReferenceTable <> 'Enquiry')
\t \t \t)
\t \t \t OR
\t \t \t (\t C.ID in \t \t (SELECT [ContactSpouseID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND ReferenceTable <> 'Enquiry')
\t \t \t)
\t \t \t OR
\t \t \t (\t ESC.ContactEnquiryID in \t \t (SELECT [ContactID] FROM [Table] WHERE [EnrolDate] > '2016-12-31' AND ReferenceTable = 'Enquiry')
\t \t \t)
THEN 'General'
ELSE '' END END
\t END
END AS ProspectiveNews
パフォーマンスが低下するのは、[Table]から何回も選択しているためです。代わりに、[表]の候補リストに参加して、おそらく集約し、結合されたフィールドを使用してケースを使用します。もし時間があれば、後で例を書くでしょう。あなたがOUTER APPLYを使用したいかもしれないメインテーブルを参照するために参加する必要がある場合は、Itzik Ben-Ganからの良い投稿があるか、ここを見てください:https://sqlbits.com/Sessions/Event14/Boost_your_T-SQL_with_the_APPLY_Operator –
ありがとう情報のために。後で時間があるなら、私はその例を見るのが大好きです。私はこれだけ新しいです。 – SSS
スキーマ情報を追加してください。 C、ESCと[Table]の関係はどうですか? –