2017-08-16 30 views
0

我有這個查詢連接回表格來計算基於特定條件的分數。在某些情況下,目標表中不存在行中需要返回的行,因此我在下面顯示當前查詢,這會導致性能下降,並且有時不會返回,因爲此特定查詢是SSRS中較大的一組查詢中的子查詢和SQL Server。在這裏的幫助將不勝感激!更有效的方式來查詢不存在的行SQL

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

這整個事情是一個子查詢?你怎麼知道這是傷害表演的部分?你可以在主要查詢之前將它作爲一個cte嗎?在沒有上下文的情況下很難提供很多幫助。 –

+1

通常情況下,「某些行不存在」意味着「LEFT JOIN」,但這裏並不清楚數據總是存在(如果有的話)。特別是如果這是子查詢的一部分,通常你只需返回空集(無行),而不是空行。 –

+0

您的第一個UNION有一個WHERE子句,它與您的第二個UNION具有NOT EXIST相同?謹慎給我們一個你想要在這裏實現的內容的背景?你只是想要一行'N/A'的ID不是不在你的第一個聯盟?如果是這種情況,那麼不需要你的第二個聯盟。 – Isaiah3015

回答

1

我不認爲你需要一個UNION在all.Your目標是模糊的,但如果我理解正確的這個,你要的是從你的第一個表返回所有的值,其中有一個ID = 048和當它不匹配時,你想N/A。

如果這是真的,那麼你不需要一個聯合。只需從A到G(或G到A - 取決於你想要的)進行左連接。這將返回來自表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

如果我理解正確的,你的 「問題」 是從UNION ALL第二查詢。

我已經列上使用LEFT JOINISNULL/IIF您的查詢,使他們產生相同的輸出(可以使用CASE如果IIF不支持)重新寫:

SELECT ISNULL(G.[Name], 'N/A')      AS Name, 
     ISNULL(G.[ID], 'N/A')       AS ID, 
     IIF(G.ID IS NULL, 'N/A', A.IName)    AS IName, 
     IIF(G.ID IS NULL, 'N/A', A.ItID)    AS ItID, 
     IIF(G.ID IS NULL, 0, COUNT(A.IHid) OVER()) AS ICount, 
     G.[AllComplete], 
     G.[IComplete], 
     ISNULL(G.[IStatus], 'N/A')     AS IStatus, 
     IIF(G.ID IS NULL, 'N/A', A.[Group])   AS [Group], 
     IIF(G.ID IS NULL, 'N/A', A.[Status])   AS [Status], 
     IIF(G.ID IS NULL, 'N/A', A.[Type])   AS [Type] 
FROM TableA A 
    LEFT JOIN TableG G 
     ON A.ID = G.ID 
WHERE  A.[ID] = ('048') -- replaced here G.ID with A.ID, since these need to be equal 
    AND NOT A.ItID = '' 
    AND NOT A.[Status] IN ('NA') 

一件事,你可能想要提取從外部查詢提供的標識符,您可以在處理中使用該標識符。無法真正說出哪個值來自此示例的外部查詢。

希望這會有所幫助。

相關問題