簡體   English   中英

如何將選定列用作同一子查詢的下一個選擇的變量

[英]How do i use a selected column as a variable for the next selection of the same sub-query

我正在嘗試編寫查詢來創建報告,對於報告,我需要獲取在我們的系統上創建表單的用戶的經理。 因為系統老舊且變化很大,所以沒有簡單的方法來獲取用戶的經理或從他們創建表單時獲取他們的經理。 因此,我之前的人為這項工作創建了 function,但成本很高。 從 function fn_getUserMan獲得結果需要很長時間。 我想調用 function 一次,然后在我的其他選擇中使用結果作為變量,因為它依賴於Frm ,我不能將它從子查詢中取出並放在主查詢中並將其設置在本地變量和 sql 不會讓我在子查詢上設置變量。

所以我的問題是:我在查詢中嘗試過的下一個選擇中是否可以使用FnMAN 它說Invalid column name 'FnMAN'. 當我在查詢中嘗試它時。

在代碼塊中,似乎我只需要它兩次,但實際上我需要它更多。 我需要檢查結果,如果它是某個人 A,我需要像我對 John 和 Jane 所做的那樣使它成為某個人 B。 所以我真的需要讓它更快。

select *,(--More selection--) 
from
(select
--
--Some selection of 10s of columns
--
(select dbo.fn_getUserMAN((
    select M.txtPerson from Frm (nolock) Fm
    JOIN FLOWDOCUMENTS(nolock) FD ON Fm.ID = FD.FILEPROFILEID
    JOIN FLOWREQUESTS(nolock) FR on FD.PROCESSID = FR.PROCESSID
    JOIN MdlFrm (nolock) M on M.ID = FR.EVENTFORMID
    where FR.EVENTFORMID !=-1 and F.FrmNo = Fm.FrmNo))
) AS 'FnMAN',

(SELECT TOP 1 (
    CASE WHEN      
        (select txtPerson from Frm_Info (nolock) as BB
        inner join FLOWREQUESTS(nolock) FQ on BB.ID = FQ.EVENTFORMID
        and FQ.PROCESSID = FD.PROCESSID) is not null 
        or 
        (select txtPerson from Frm_Info (nolock) as BB
        inner join FLOWREQUESTS(nolock) FQ on BB.ID = FQ.EVENTFORMID
        and FQ.PROCESSID = FD.PROCESSID) !=''
    THEN            
        CASE WHEN FnMAN = 'John Doe'
        THEN 'Jane Doe'
        --More checks and switches on managers
        ELSE FnMAN END     
    WHEN F.txtManager IS NOT NULL THEN F.txtManager END))

from Frm (NOLOCK)  F
INNER JOIN FLOWDOCUMENTS(NOLOCK) FD ON FD.FILEPROFILEID = F.ID 
INNER JOIN LIVEFLOWS(NOLOCK)  LF ON LF.ID = FD.PROCESSID
INNER JOIN FLOWSTATUSES(NOLOCK)  FS ON FS.PROCESS = LF.PROCESS AND FS.VERSION =LF.FLOWVERSION AND FS.STATUS = LF.STATUS
WHERE LF.DELETED = 0  and F.FrmNo IS NOT NULL and F.FrmNo != '') T

我使用LEFT JOIN找到了解決方案,並添加了一個新列以用作FnMAN的結果。 我不知道這是否是一種健康的解決方案,但它確實有效。

select *,(--More selection--) 
from
(select
--
--Some selection of 10s of columns
--       
(SELECT TOP 1 (
    CASE WHEN      
        (select txtPerson from Frm_Info (nolock) as BB
        inner join FLOWREQUESTS(nolock) FQ on BB.ID = FQ.EVENTFORMID
        and FQ.PROCESSID = FD.PROCESSID) is not null 
        or 
        (select txtPerson from Frm_Info (nolock) as BB
        inner join FLOWREQUESTS(nolock) FQ on BB.ID = FQ.EVENTFORMID
        and FQ.PROCESSID = FD.PROCESSID) !=''
    THEN            
        CASE WHEN FnMAN.MAN = 'John Doe'
        THEN 'Jane Doe'
        --More checks and switches on managers
        ELSE FnMAN.MAN END     
    WHEN F.txtManager IS NOT NULL THEN F.txtManager END))

from Frm (NOLOCK)  F
INNER JOIN FLOWDOCUMENTS(NOLOCK) FD ON FD.FILEPROFILEID = F.ID 
INNER JOIN LIVEFLOWS(NOLOCK)  LF ON LF.ID = FD.PROCESSID
INNER JOIN FLOWSTATUSES(NOLOCK)  FS ON FS.PROCESS = LF.PROCESS AND FS.VERSION =LF.FLOWVERSION AND FS.STATUS = LF.STATUS
LEFT JOIN (
(select Fm.FormID, dbo.fn_getUserMAN(M.txtPerson) MAN
    from Frm (nolock) Fm
    JOIN FLOWDOCUMENTS(nolock) FD ON Fm.ID = FD.FILEPROFILEID
    JOIN FLOWREQUESTS(nolock) FR on FD.PROCESSID = FR.PROCESSID
    JOIN MdlFrm (nolock) M on M.ID = FR.EVENTFORMID
    where FR.EVENTFORMID !=-1)
) AS 'FnMAN' on Fm.FormID = F.FormID,
WHERE LF.DELETED = 0  and F.FrmNo IS NOT NULL and F.FrmNo != '') T

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM