簡體   English   中英

在主查詢的另一列中重用子查詢結果

[英]Reuse a subquery result in another column in main query

在下面的查詢中,列 GLName 和 GLDesc 獲取相同的值,但我需要具有相同的值和 2 個不同的列名,以滿足預定義 Excel 模板的要求。

SELECT T0.GLCode, (SELECT ST0.Name From GL ST0 WHERE ST0.Code = T0.GLCode) AS GLName, 
(SELECT ST0.Name FROM GL ST0 WHERE ST0.Code = T0.GLCode) AS GLDesc
FROM Trans T0

如何重用第一個子查詢的結果以避免編寫第二個子查詢? 這是一個簡化的例子。 在實際查詢中,大約有 10 個子查詢需要在另一個子查詢中重用。 就我而言,很難用所有必需的值構建另一個表,以便從中獲取主查詢中的值,因為主表很大,並且要從主表中獲取的值僅適用於基於的特定代碼在 Trans 表中過濾的記錄上。

編輯1:

我特別詢問子查詢的重用。 我不想在這里使用 JOIN,因為帶有多個 JOIN 的實際查詢大約需要 60 秒,而帶有子查詢的查詢大約需要 7-8 秒。 唯一的不便是我必須多次編寫相同的子查詢。

編輯2:

查詢位於存儲過程中,如下所示:

CREATE PROCEDURE [dbo].[My_Query_Proc]
AS
BEGIN

    SELECT T0.GLCode, (SELECT ST0.Name From GL ST0 WHERE ST0.Code = T0.GLCode) AS GLName, 
    (SELECT ST0.Name FROM GL ST0 WHERE ST0.Code = T0.GLCode) AS GLDesc
    FROM Trans T0

END

我更喜歡在存儲過程中使用單個查詢。 我從外部數據命令中的 Excel 文件中調用此存儲過程。 我更喜歡將其封裝在存儲過程中,而不是直接在 Excel 文件中編寫查詢。

如果我嘗試添加一個變量:

DECLARE @GLName NVARCHAR(255)

並將查詢更改為:

    SELECT T0.GLCode, @GLName = (SELECT ST0.Name From GL ST0 WHERE ST0.Code = T0.GLCode) AS GLName, 
    (SELECT ST0.Name FROM GL ST0 WHERE ST0.Code = T0.GLCode) AS GLDesc
    FROM Trans T0

我收到語法錯誤。 有沒有辦法不使用游標或臨時表或編寫程序邏輯來將第一個子查詢的結果提取到變量中,並將該變量的值用於列 GLName 和 GLDesc?

我在 SP 中想要的“虛構”查詢是這樣的:

CREATE PROCEDURE [dbo].[My_Query_Proc]
AS
BEGIN

    DECLARE @GLName NVARCHAR(255)

    SELECT T0.GLCode, @GLName = (SELECT ST0.Name From GL ST0 WHERE ST0.Code = T0.GLCode) AS GLName, 
    @GLName AS GLDesc
    FROM Trans T0

END

是否有任何與我上面想象的查詢相對應的實際查詢語法?

將您的子查詢放在應用中使其可以重用:

select t.GLCode, g.GLName, g.GLName GLDesc
from Trans t
outer apply (
  select [Name] GLName
  from GL
  where GL.Code = t.GLCode
)g;

只需使用正確的連接即可:

SELECT T0.GLCode, ST0.Name AS GLName, ST0.Name AS GLDesc
FROM Trans T0
    INNER JOIN GL ST0 ON T0.GLCode = ST0.Code

暫無
暫無

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

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