我有这个查询连接回一个表来根据某些标准计算得分。在某些情况下,目标表中不存在需要返回某些内容的行,因此我有下面的当前查询,它会查杀性能,有时不会返回,因为此特定查询是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')))
答案 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 JOIN
和ISNULL
/ IIF
重新编写了您的查询,以便它们生成相同的输出(如果{{1,您可以使用CASE
不支持):
IIF
有一件事,您可能想要提取一个从外部查询提供的标识符,您可以在处理过程中使用该标识符。无法真正说出使用此示例从外部查询中获得哪个值。
希望这有帮助。