Sql server 如何筛选嵌套查询中的记录,然后从筛选结果中选择同一表中的其他列?

Sql server 如何筛选嵌套查询中的记录,然后从筛选结果中选择同一表中的其他列?,sql-server,join,reporting-services,parameters,nested-query,Sql Server,Join,Reporting Services,Parameters,Nested Query,首先,我想在两个嵌套查询(基于用户输入的参数@Borough和@WOEntity)中过滤并仅选择objectid,然后将同一个表中的列(类型和优先级)连接回最精细的记录集。这样做的目的是提高SSRS报告背后的存储过程的性能 我收到以下错误消息: 味精156,第15级,状态1,第13行 关键字“SELECT”附近的语法不正确 味精102,第15级,状态1,第36行 “')附近的语法不正确 到目前为止,我的查询如下所示: declare @Borough int declare @WOEntityI

首先,我想在两个嵌套查询(基于用户输入的参数@Borough和@WOEntity)中过滤并仅选择objectid,然后将同一个表中的列(类型和优先级)连接回最精细的记录集。这样做的目的是提高SSRS报告背后的存储过程的性能

我收到以下错误消息:

味精156,第15级,状态1,第13行
关键字“SELECT”附近的语法不正确

味精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 

您的查询必须与模式匹配:
从何处选择
。我的意思是,您可以重新排序条款:

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

免责声明:这只是一个开始调试和隔离问题的建议。我想,在这些变化之后,你会发现新的问题。请不要在这篇文章中询问新问题。

当您开始删除代码时,您何时会停止收到该消息?您不能使用包含B列名称的FROM和WHERE for select查询。因为它是一个命名查询,并且包含了它需要封装的所有内容。。(代码)为B。如果您尝试再次加入WO。您必须在“as B”之后通过左侧或内部执行此操作,并使用您在“as B”From where子句中放置的条件。