2012-01-25 28 views
0

我有一個SQL Server查詢爲:使用聯盟的SQL Server查詢 - 任何好的替代可能?

SELECT top 1 vConsentInfo FROM 
(   
      SELECT cons.vConsentInfo,cons.dTimeStamp ,logs.iPartnerProfileID 
      FROM H_OutMessageLog logs INNER JOIN H_OutMessageConsent cons on cons.iOutMessageQID = logs.iOutQueueID 
       WHERE logs.iPatID = 65686 and logs.iPracID = 4 
     UNION 
      SELECT cons.vConsentInfo,cons.dTimeStamp,Q.iPartnerProfileID 
      FROM H_OutMessageQueue Q INNER JOIN H_OutMessageConsent cons on cons.iOutMessageQID = Q.iOutQueueID 
       WHERE Q.iPatID = 65686 and Q.iPracID = 4 
) A 
WHERE A.iPartnerProfileID = Prof.IPartnerProfileID 
Order BY dTimeStamp DESC 

表的工作原理爲:一個記錄插入到了H_OutMessageQueue在開始時;那麼它插入H_OutMessageConsent ... 現在有從H_OutMessageQueue處理記錄並登錄到H_OutMessageLog ....

我能擺脫這種UNION東西一個單獨的工作進程?請注意,這是一個較大的CTE查詢的子查詢。

+1

爲什麼你想擺脫'UNION'? – Oded

+0

我的意思是,如果有一些較強的構造這樣的,我不知道....其實我不得不做出的工會,這樣我可以進行排序,並得到這兩個表中最新的條目。 – Umer

回答

4

是的,但它可能不是更好。你必須工作到這個大的查詢

SELECT TOP 1 
    cons.vConsentInfo, 
    ISNULL(logs.iPartnerProfileID , Q.iPartnerProfileID) AS iPartnerProfileID 
FROM 
    H_OutMessageConsent cons 
    LEFT JOIN 
    H_OutMessageLog logs ON cons.iOutMessageQID = logs.iOutQueueID AND 
           logs.iPatID = 65686 and logs.iPracID = 4 
    LEFT JOIN 
    H_OutMessageQueue Q ON cons.iOutMessageQID = Q.iOutQueueID AND 
           Q.iPatID = 65686 and Q.iPracID = 4 
WHERE 
    ISNULL(logs.iPartnerProfileID , Q.iPartnerProfileID) IS NOT NULL 
ORDER BY 
    cons.dTimeStamp DESC 
+0

似乎足夠合乎邏輯...但它的表現比聯盟還是差不多呢? – Umer

+0

@Umer:你必須嘗試在您的環境 – gbn

+0

它工作得更好:)(技術上和邏輯上) – Umer

1

除了GBN答覆。這將消除查詢中的額外負擔:)。

SELECT top 1 vConsentInfo FROM 
(   
    SELECT cons.vConsentInfo,cons.dTimeStamp ,logs.iPartnerProfileID 
    From 
    (
     Select iPartnerProfileID FROM H_OutMessageLog logs 
     WHERE logs.iPatID = 65686 and logs.iPracID = 4 
    )logs 
    Left JOIN H_OutMessageConsent cons on cons.iOutMessageQID = logs.iOutQueueID 
    UNION 
    SELECT cons.vConsentInfo,cons.dTimeStamp,Q.iPartnerProfileID 
    From 
    (
     Select iPartnerProfileID FROM H_OutMessageQueue Q 
     WHERE Q.iPatID = 65686 and Q.iPracID = 4 
    )Q 
    Left JOIN H_OutMessageConsent cons on cons.iOutMessageQID = Q.iOutQueueID 
) A 
WHERE A.iPartnerProfileID = Prof.IPartnerProfileID 
Order BY dTimeStamp DESC 
+0

最內層查詢,它選擇唯一合作伙伴簡檔......但它與H_OutMessageConsent左連接上iOutQueueID到iOutMessageQID ....我想你忘記了從日誌中選擇iOutQueueID ....然而,有一些想法... – Umer

+1

這將是相當快的加入將會對過濾記錄... :) – Pankaj