2012-01-25 7 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

私が知りませんが、この目的のためにもっと強力な構造があれば....実際には、私はこれらの2つのテーブル内で最も新しいエントリをソートして取得できるように、実際にはユニオンを作成しなければなりませんでした。 – Umer

答えて

4

はい、ただし、より良いではない可能性があります。あなたはGBN応答に加えて、あなたの大きなクエリ

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

にこれを作業する必要があります。これは、あなたのクエリから余分な負担を取り除くでしょう:)。

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

最も内側のクエリですが、パートナーのprofileidだけが選択されますが、iOutQueueIDのH_OutMessageConsent iOutMessageQID ....私はあなたがログからiOutQueueIDを選択するのを忘れたと思う....しかし、いくつかのアイデアを持って... – Umer

+1

これは、フィルタリングされたレコードになるので、これはかなり高速になります... :) – Pankaj

関連する問題