使用Union的SQL Server查询 - 任何好的备用可能吗?

Ume*_*mer 0 sql-server union sql-server-2008

我有一个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
Run Code Online (Sandbox Code Playgroud)

该表的作用如下:H_OutMessageQueue在开头插入记录; 然后它插入H_OutMessageConsent...现在有一个单独的工作进程处理记录H_OutMessageQueue并将其记录到H_OutMessageLog....

我可以摆脱这UNION件事吗?请注意,这是较大CTE查询的子查询.

gbn*_*gbn 5

是的,但可能不会更好.您必须将此工作放入更大的查询中

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
Run Code Online (Sandbox Code Playgroud)