SR004- Столбец без индекса, который используется в качестве тестового выражения предиката IN, может снизить производительность - PullRequest
1 голос
/ 03 июля 2019

Я довольно новичок в SQL, поэтому получил сообщение об ошибке, как указано в заголовке моего вопроса.

Прикрепленное изображение - моя команда sql.enter image description here

Если я не использую IN, я получу еще одну ошибку: подзапрос возвращает более 1 значения ...

Как мне написать это, чтобы я не получил никакогоэтой ошибки?

Ниже приведен код SQL: BEGIN

   SELECT [c].[ChargeSubCategoryOID] ,[c].[Description], [c].[Qty], [c].[Uom], [c].[BeforeGovtSubsidy], [c].[AfterGovtSubsidy],

   [c].[ChargesIndicatorCode], [c].[ChargesIndicatorValue]

   FROM ChargeItems AS [c]

   WHERE

   [c].[ChargeSubCategoryOID] IN

   (

          SELECT [c].[OID]

          FROM ChargeSubCategories AS [c]

          WHERE

          [c].[ChargeCategoryOID] IN

          (

                 SELECT [cg].[OID]

                 FROM ChargeCategories AS [cg]

                 WHERE

                 [cg].[ChargeGroupOID] IN

                 (

                       SELECT [cg].[OID]

                       FROM ChargeGroups AS [cg]

                       WHERE

                       [cg].[InvoiceOID] IN

                       (

                              SELECT TOP(1)

                              [p].[OID]

                              FROM [Invoices] AS [p]

                              LEFT JOIN [Payors] AS [p.Payors] ON [p].[OID] = [p.Payors].[InvoiceOID]

                              LEFT JOIN [Details] AS [p.Details] ON [p].[OID] = [p.Details].[InvoiceOID]

                              WHERE ([p].[InvoiceReferenceNo] = @BillRefNo) AND ([p.Details].[IdentificationNoValue] = @Id)

                              ORDER BY [p].[CreationTime] DESC, [p].[OID], [p.Payors].[OID]       

                       )            

                 )     

   )

   )ORDER BY [c].[ChargeSubCategoryOID] ASC

END

Любая помощь приветствуется!Спасибо!

1 Ответ

1 голос
/ 04 июля 2019

Я заменил ваши входы на внутренние соединения.Обратите внимание, что я изменил псевдонимы, чтобы они все отличались друг от друга, предотвращая неоднозначность.

Единственный значимый бит - это последнее СОЕДИНЕНИЕ, потому что я не внутренне присоединился к накладным таблицы, а к трем левым объединенным таблицам, присваивающим ему псевдоним.так что вы можете установить условие соединения для остальной части вашего оператора SQL.

SELECT it.ChargeSubCategoryOID ,it.Description, it.Qty, it.Uom, it.BeforeGovtSubsidy, 
       it.AfterGovtSubsidy, it.ChargesIndicatorCode, it.ChargesIndicatorValue
FROM ChargeItems AS it
     inner join ChargeSubcategories AS sc on sc.OID = it.ChargeSubCategoryOID
     inner join ChageCategories AS ct on ct.OID = sc.ChargeCategoryOID
     inner join ChargeGroups AS gr on gr.OID = ct.ChargeGroupOID
     inner join (select top 1 in.OID
                 from Invoices AS in
                      left join Payors AS py on py.InvoiceOID = in.OID
                      left join Details AS dt on dt.InvoiceOID = in.OID
                 where in.InvoiceReferenceNo = @BillRefNo AND dt.IdentificationNoValue = @Id
                 order by in.CreationTime desc, in.OID, py.OID
                ) AS in2 on in2.OID = gr.Invoice.OID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...