Запрос SQL Server с использованием Union - возможна ли альтернатива? - PullRequest
0 голосов
/ 25 января 2012

У меня запрос к 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 запроса.

Ответы [ 2 ]

5 голосов
/ 25 января 2012

Да, но это не может быть лучше .Вам придется добавить это в ваш большой запрос

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
1 голос
/ 25 января 2012

В дополнение к ответу ГБН. Это снимет дополнительную нагрузку с вашего запроса:).

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
...