簡體   English   中英

如何使用子查詢作為函數參數?

[英]How to use a subquery as a function paramter?

如果我想在 SQL 腳本中創建一個“用戶變量”,我通常會在頂部創建一個參數 WITH 語句,以便在運行腳本之前為腳本用戶提供一個更改變量的位置。 像這樣:

WITH  parms AS (
          select '2022-01-01' AS data_date
)

SELECT  SUM(a.amount) AS total
FROM    a
JOIN    parms
  ON    1=1
WHERE   a.data_date BETWEEN 
                       DATE_FORMAT(parms.data_date,'yyyy-MM-01') --BOM
                       AND
                       LAST_DAY(parms.data_date) --EOM

UNION ALL
{table b}
...
{table x}
UNION ALL

SELECT  SUM(z.amount) AS total
FROM    z
JOIN    parms
  ON    1=1
WHERE   z.data_date BETWEEN 
                       DATE_FORMAT(parms.data_date,'yyyy-MM-01') --BOM
                       AND
                       LAST_DAY(parms.data_date) --EOM
;

我的問題是我的表az每個都包含數億行,我認為parms on 1=1肯定很昂貴。

我想消除每一行的join parms ,而是在WHERE中選擇參數:

WHERE   a.data_date BETWEEN 
                       DATE_FORMAT((select parms.data_date from parms limit 1),'yyyy-MM-01') --BOM
                       AND
                       LAST_DAY(select parms.data_date from parms limit 1) --EOM

是否可以在函數參數中使用子查詢? 我是否采用正確的方法來加快速度?

如果必須,我可以回退到消除WITH parms ,而是在每個WHERE語句中的整個腳本中添加日期。

編輯:忘記添加我僅限於單個 SQL 語句。 我不能在單獨的語句中聲明變量。

您可以聲明一個變量並在 where 子句中引用它。

DECLARE @data_date VARCHAR(8) = '22-01-01';

SELECT  SUM(a.amount) AS total
FROM    a
WHERE   a.data_date BETWEEN 
                       DATE_FORMAT(@data_date,'yyyy-MM-01') --BOM
                       AND
                       LAST_DAY(@data_date) --EOM

暫無
暫無

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

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