查询不存在SQL的行的更有效方法

时间:2017-08-16 16:44:57

标签: sql sql-server reporting-services ssrs-2012

我有这个查询连接回一个表来根据某些标准计算得分。在某些情况下,目标表中不存在需要返回某些内容的行,因此我有下面的当前查询,它会查杀性能,有时不会返回,因为此特定查询是SSRS中较大评分查询集中的子查询和SQL Server。

   SELECT
                G.[Name], 
                G.[ID], 
                A.IName, 
                A.ItID, 
                COUNT(A.IHid) OVER() AS ICount, 
                G.[AllComplete], 
                G.[IComplete], 
                G.[IStatus], 
                A.[Group], 
                A.[Status] AS [Status], 
                A.[Type] AS [Type]
   FROM TableA A
         INNER JOIN TableG G
                ON A.ID = G.ID AND G.id IS Not NULL
   WHERE G.[ID] = ('048') 
   AND NOT ( A.ItID = '' ) 
   AND NOT ( A.[Status] IN ('NA'))
   UNION ALL
   SELECT 'N/A', 'N/A', 'N/A', 'N/A', 0, NULL, NULL, 'N/A', 'N/A', 'N/A', 'N/A'
   WHERE NOT EXISTS (SELECT 1 
                              FROM TableA A 
                                    INNER JOIN TableG G 
                                           ON A.ID = G.ID AND G.id IS Not NULL
                               WHERE  G.[ID] = ('048') 
                               AND NOT ( A.ItID = '' ) 
                               AND NOT ( A.[Status] IN ('NA')))

2 个答案:

答案 0 :(得分:0)

我认为你根本不需要UNION。你的目标很模糊但是如果我理解正确的话,你想要的是从你的第一个表中返回所有值,其中ID = 048,当它不匹配时那,你想要N / A.

如果这是真的,那么你不需要UNION。只需从A到G进行LEFT JOIN(或G到A - 取决于你想要的)。这将返回表A中包含N / A的所有数据,然后返回一个包含数据的数据 - 即048

仅供参考:您的表格不应包含'',如果是这种情况,您应该将此更新为NULL,然后执行NOT IN NULL,而不是WHERE NOT('')

SELECT
            G.[Name], 
            G.[ID], 
            A.IName, 
            A.ItID, 
            COUNT(A.IHid) OVER() AS ICount, 
            G.[AllComplete], 
            G.[IComplete], 
            G.[IStatus], 
            A.[Group], 
            A.[Status] AS [Status], 
            A.[Type] AS [Type]
   FROM TableA A
      LEFT JOIN TableG G ON A.ID = G.ID AND G.[ID] = ('048') 
   WHERE  A.ItID NOT IN ('') -- this really should be NULL
   AND    A.[Status] NOT IN ('N/A')

答案 1 :(得分:0)

如果我理解正确,您的“问题”是来自UNION ALL的第二个查询。

我在列上使用LEFT JOINISNULL / IIF重新编写了您的查询,以便它们生成相同的输出(如果{{1,您可以使用CASE不支持):

IIF

有一件事,您可能想要提取一个从外部查询提供的标识符,您可以在处理过程中使用该标识符。无法真正说出使用此示例从外部查询中获得哪个值。

希望这有帮助。