Как получить значение из подзапроса в основном запросе? - PullRequest
0 голосов
/ 11 июня 2019

Я хотел бы получить dtmPost в основном запросе.Я попытался a.dtmPost после ai.strID, но это не сработало.Я не уверен, возможно ли это сделать без больших изменений.Правильно ли мое предположение?

SELECT  p.strMed,
    d.lngAKey,
    ai.strID

FROM    tblP p RIGHT JOIN tblV v 
ON  p.lngPKey  = v.lngPKey INNER JOIN tblD d 
ON  v.lngVKey  = d.lngVKey INNER JOIN tblAI ai
ON  d.lngAKey = ai.lngAKey

WHERE   dtmEff between

    (SELECT MAX(a.dtmPost) AS dtmPost

    FROM    (SELECT dtmPost 
        FROM    tblPBIH pbih 
        WHERE   pbih.lngAKey    = d.lngAKey 

        UNION   

        SELECT  dtmPost 
        FROM    tblPBI pbi 
        WHERE   pbi.lngAKey     = d.lngAKey 
        ) a)

AND (SELECT MAX(a.dtmPost) AS dtmPost 

    FROM    (SELECT DATEADD(D, 10, pbih.dtmPost) AS dtmPost 
        FROM    tblPBIH pbih 
        WHERE   pbih.lngAKey    = d.lngAKey 

        UNION   

        SELECT  DATEADD(D, 10, pbi.dtmPost) AS dtmPost 
        FROM    tblPBI pbi 
        WHERE   pbi.lngAKey     = d.lngAKey 
        ) a)

Я придумал следующее, и оно работает, но есть ли другой способ, который лучше?

DECLARE @X date, @Y date

SET @X =(SELECT MAX(a.dtmPost) AS dtmPost

    FROM    (SELECT dtmPost 
        FROM    tblPBIH pbih 
        WHERE   pbih.lngAKey    = d.lngAKey 

        UNION   

        SELECT  dtmPost 
        FROM    tblPBI pbi 
        WHERE   pbi.lngAKey     = d.lngAKey 
        ) a)

SET @Y =(SELECT MAX(a.dtmPost) AS dtmPost 

    FROM    (SELECT DATEADD(D, 10, pbih.dtmPost) AS dtmPost 
        FROM    tblPBIH pbih 
        WHERE   pbih.lngAKey    = d.lngAKey 

        UNION   

        SELECT  DATEADD(D, 10, pbi.dtmPost) AS dtmPost 
        FROM    tblPBI pbi 
        WHERE   pbi.lngAKey     = d.lngAKey 
        ) a)

SELECT  p.strMed,
    d.lngAKey,
    ai.strID,
    @X AS dtmBackDate

FROM    tblP p RIGHT JOIN tblV v 
ON  p.lngPKey  = v.lngPKey INNER JOIN tblD d 
ON  v.lngVKey  = d.lngVKey INNER JOIN tblAI ai
ON  d.lngAKey = ai.lngAKey

WHERE   dtmEff > @X
AND     dtmEff <= @Y

Спасибо за вашу помощь.

1 Ответ

1 голос
/ 12 июня 2019

Из того, что я вижу, единственная разница между вашими двумя датами - 10 дней, поэтому нет абсолютно никакой причины делать запрос дважды.

Это версия запроса, переработанная.Поскольку у нас нет данных испытаний, я понятия не имею, есть ли опечатки, но вы должны понять.Вы можете написать его, используя CTE, если хотите.

Я также поменял ваше правое соединение на левое, так как лично я никогда не использовал правое соединение, но это может быть просто личным предпочтением.

SELECT  p.strMed,
    d.lngAKey,
    ai.strID,
    dates.dtmPost AS dtmBackDate
FROM tblV v  
INNER JOIN tblD d ON  v.lngVKey  = d.lngVKey 
INNER JOIN tblAI ai ON  d.lngAKey = ai.lngAKey
LEFT JOIN tblP p ON  p.lngPKey  = v.lngPKey
INNER JOIN (
        select  lngAKey, max(dtmPost) dtmPost from 
        (
            SELECT  lngAKey, dtmPost 
            FROM    tblPBIH pbih 
            WHERE   pbih.lngAKey

            UNION   

            SELECT  lngAKey, dtmPost 
            FROM    tblPBI pbi 
            WHERE   pbi.lngAKey
        ) q
        group by lngAKey
        ) dates on dates.lngAKey=d.lngAKey
WHERE   dtmEff > dates.dtmPost
AND     dtmEff <= DATEADD(D, 10, dates.dtmPost)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...