我有一個查詢,我一直在使用用戶輸入(即 &&year)輸入要在查詢中運行的年份:
SELECT
t.type_code ,
t.sub_type_code,
COUNT(t.unique_number_id),
SUM(t.area_in_hectares)
FROM
mytable t
WHERE
to_char(t.start_date, 'YYYY') <= '&&year' AND
(
to_char(t.event_date, 'YYYY') > '&&year' OR
t.event_date IS NULL OR
t.type_code = 'P'
)
GROUP BY
t.type_code ,
t.sub_type_code
我想讓這個更高效,并且考慮到我的一些其他編程經驗,我認為,如果我可以回圈多年,我可以讓這個查詢更高效地運行。我想知道是否有一種方法可以將串列中的年份迭代地注入到用戶變數中,而不是手動輸入它們。我每年運行一次查詢,用戶運行近 100 年,顯然手動輸入年份效率不高。
我一直在閱讀有關 for 回圈和 while 回圈的資訊,但我不清楚是否可以在 Oracle SQL 中使用它們。
感謝您的任何想法或建議。
uj5u.com熱心網友回復:
使用子查詢因式分解 ( WITH) 子句在單個查詢中輸入所有年份,然后將JOIN其輸入到您的表中。這樣您就不必在客戶端和資料庫之間產生多個請求的開銷,并且資料庫不需要決議多個查詢:
WITH years (year) AS (
SELECT 1942 FROM DUAL UNION ALL
SELECT 1970 FROM DUAL UNION ALL
SELECT 2000 FROM DUAL UNION ALL
SELECT 2022 FROM DUAL
)
SELECT y.year,
t.type_code,
t.sub_type_code,
COUNT(t.unique_number_id),
SUM(t.area_in_hectares)
FROM mytable t
INNER JOIN years y
ON (
t.start_date < TO_DATE( (year 1) || '-01-01', 'YYYY-MM-DD' )
AND (
t.event_date >= TO_DATE( (year 1) || '-01-01', 'YYYY-MM-DD' )
OR t.event_date IS NULL
OR t.type_code = 'P'
)
)
GROUP BY
y.year,
t.type_code,
t.sub_type_code
您還可以將年份轉換為日期,而不是嘗試將表列轉換為字串。這將允許您在日期列上使用索引(如果存在)。
uj5u.com熱心網友回復:
你可以這樣做:
BEGIN
FOR years IN (
SELECT * FROM years
ORDER BY year asc
)
LOOP
SELECT
t.type_code ,
t.sub_type_code,
COUNT(t.unique_number_id),
SUM(t.area_in_hectares)
FROM mytable t
WHERE to_char(t.start_date, 'YYYY') <= year.year AND
(
to_char(t.event_date, 'YYYY') > year.year OR
t.event_date IS NULL OR
t.type_code = 'P'
)
GROUP BY t.type_code , t.sub_type_code
END LOOP;
END;
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/409094.html
標籤:
下一篇:選擇帳戶的最大行數
