Как я могу отфильтровать записи во вложенных запросах и затем выбрать другие столбцы в той же таблице из отфильтрованных результатов? - PullRequest
0 голосов
/ 11 декабря 2018

Сначала я хочу отфильтровать и выбрать OBJECTIDS только в двух вложенных запросах (на основе введенных пользователем параметров, @Borough и @WOEntity), а затем соединить столбцы (Тип и Приоритет) из той же таблицы обратно в наиболее уточненный набор.записей.Целью этого является повышение производительности хранимых процедур, которые скрываются за отчетом SSRS.

Я получаю следующие сообщения об ошибках:

Сообщение 156, Уровень 15, Состояние 1, Строка 13
Неверный синтаксис рядом с ключевым словом «SELECT»

Msg 102, Уровень 15, Состояние 1, Строка 36
Неверный синтаксис рядом с ')'

Мой запрос до сих пор выглядит так:

declare @Borough int
declare @WOEntityINT int = NULL --0, 1, 3, 4, 11, 10, NULL

set @Borough = 1
set @WOEntityINT = 1


SELECT 
    B.OBJECTID, WO.Type, WO.Priority
FROM
    CFAdmin.WorkOrder_EVW as WO
WHERE 
    B.OBJECTID = WO.OBJECTID

(
SELECT A.ObjectID
FROM
    (SELECT
         ObjectID,
         CASE 
            WHEN WOEntity = 0 THEN 0 -- In-House
            WHEN WOEntity IN (1, 2) THEN 1 -- Contract
            WHEN WOEntity IN (3, 4) THEN 3 -- Utility 
            WHEN WOEntity IN (5, 6) THEN 4 -- Permitted
            WHEN WOEntity IS NULL THEN 10 -- No Entity
            ELSE 11 --11 = Other
         END AS WOEntityINT                                         
     FROM 
         CFAdmin.WorkOrder_EVW
     WHERE
         (Status NOT IN (1, 2)) AND
         (Borough IN (@Borough))) AS A
 WHERE 
     (@WOEntityINT IS NULL OR (WOEntityINT = @WOEntityINT)) --field WOEntityINT is a derived field 
 ) AS B 

1 Ответ

0 голосов
/ 11 декабря 2018

Ваш запрос должен соответствовать шаблону: SELECT FROM WHERE.Я имею в виду, что вы можете изменить порядок предложений:

SELECT B.OBJECTID, WO.Type, WO.Priority
FROM CFAdmin.WorkOrder_EVW as WO
INNER JOIN (
  SELECT A.ObjectID
  FROM
    (
    SELECT
        ObjectID,
            CASE 
                WHEN WOEntity = 0 THEN 0 -- In-House
                WHEN WOEntity IN (1,2) THEN 1 -- Contract
                WHEN WOEntity IN (3,4) THEN 3 -- Utility 
                WHEN WOEntity IN (5,6) THEN 4 -- Permitted
                WHEN WOEntity IS NULL THEN 10 -- No Entity
                ELSE 11 --11 = Other
            END AS WOEntityINT                                          

        FROM CFAdmin.WorkOrder_EVW
        WHERE
            (Status not in (1,2)) AND
            (Borough IN (@Borough)) 

     ) AS A

   WHERE (@WOEntityINT IS NULL OR (WOEntityINT = @WOEntityINT)) --field 
   WOEntityINT is a derived field 
 ) AS B
 on B.OBJECTID = WO.OBJECTID

Помните, что вы можете написать CTE для улучшения читабельности:

WITH a AS 
( 
       SELECT objectid, 
              CASE 
                     WHEN woentity = 0 THEN 0      -- In-House 
                     WHEN woentity IN (1,2) THEN 1 -- Contract 
                     WHEN woentity IN (3,4) THEN 3 -- Utility 
                     WHEN woentity IN (5,6) THEN 4 -- Permitted 
                     WHEN woentity IS NULL THEN 10 -- No Entity 
                     ELSE 11                       --11 = Other 
              END AS woentityint 
       FROM   cfadmin.workorder_evw 
       WHERE  ( 
                     status NOT IN (1,2)) 
       AND    ( 
                     borough IN (@Borough)) )
, b AS 
( 
       SELECT a.objectid 
       FROM   a 
       WHERE  ( 
                     @WOEntityINT IS NULL 
              OR     ( 
                            woentityint = @WOEntityINT)) --field 
              woentityint IS a derived field 
) 
SELECT     b.objectid, 
           wo.type, 
           wo.priority 
FROM       cfadmin.workorder_evw AS wo 
INNER JOIN b 
ON         b.objectid = wo.objectid

Отказ от ответственности: это всего лишь предложение начать отлаживать и изолировать вашу проблему,Я думаю, после этих изменений вы найдете новые проблемы.Пожалуйста, не задавайте новых вопросов в этом сообщении.

...