簡體   English   中英

Oracle SQL-嵌套子查詢未加入主查詢

[英]Oracle SQL - Nested sub query not joining to main query

我在讓子查詢在其中的where子句中的主查詢中加入真正的麻煩。

在明確定義字段時有效的查詢:

SELECT m.field1, m.field2, m.field3, m.myfield, etc etc
(SELECT aa.daysfromprev12 FROM(
  (SELECT subsubm.myfield, MAX(subsubm.date_to)-(SELECT MAX(add_months( to_date(subsubsubm.date_from), -12 )) FROM maintable subsubsubm WHERE subsubsubm.myfield= subsubm.myfield) AS daysfromprev12,
  row_number() OVER (ORDER BY (MAX(subsubm.date_to)-(SELECT MAX(add_months( to_date(subsubsubm.date_from), -12 )) FROM maintable subsubsubm WHERE subsubsubm.myfield= subsubm.myfield)) DESC) rn
  FROM maintable subsubm 
  WHERE subsubm.myfield = '123456'
  GROUP BY subsubm.myfield, subsubm.absence_id) aa) 
where aa.myfield = '123456' and aa.rn = 2)
AS dayss
FROM maintable m
where m.myfield = '123456'

如何替換subsubm.myfield = '123456'aa.myfield = '123456'來引用主查詢= m.myfield

在您的SQL語句中,對同一個表的調用太多了。 如果我設法使您的查詢正常結束,我認為可以將其替換為以下內容:

SELECT field1,
       field2,
       field3,
       field4,
       myfield,
       MAX(CASE WHEN rn = 2 THEN days end) OVER (PARTITION BY myfield) days
FROM   (SELECT field1,
               field2,
               field3,
               field4,
               myfield,
               daysfromprev12 AS days,
               row_number() OVER (ORDER BY daysfromprev12 DESC) rn
        FROM   (SELECT field1,
                       field2,
                       field3,
                       field4,
                       myfield,
                       MAX(date_to) OVER (PARTITION BY myfield, absence_id) -
                         MAX(add_months(TRUNC(date_from), -2)) OVER (PARTITION BY myfield) daysfromprev12
                FROM   maintable
                WHERE  myfield = '123456'));

注意:未經測試,因為您沒有提供任何示例數據來使用。 另外,您正在做to_date(date_from) ,我假設date_from是DATE數據類型,並且想擺脫時間部分,所以我將其轉換為trunc(date_from) 如果是字符串,則還需要在to_date()輸入日期格式掩碼,以避免發生不必要的隱式轉換。


ETA:如果要采用這種方法,則可能會發現,如果使用子查詢因子(又稱為通用表表達式,又稱為CTE)來分離子查詢,則讀取/寫入/維護會更容易。 例如,上面的查詢可以重寫為:

with get_initial_prev12days as (SELECT field1,
                                       field2,
                                       field3,
                                       field4,
                                       myfield,
                                       MAX(date_to) OVER (PARTITION BY myfield, absence_id) -
                                         MAX(add_months(TRUNC(date_from), -2)) OVER (PARTITION BY myfield) daysfromprev12
                                FROM   maintable
                                WHERE  myfield = '123456'),
            interim_results as (SELECT field1,
                                       field2,
                                       field3,
                                       field4,
                                       myfield,
                                       daysfromprev12 AS days,
                                       row_number() OVER (ORDER BY daysfromprev12 DESC) rn
                                FROM   get_initial_prev12days)
select field1,
       field2,
       field3,
       field4,
       myfield,
       MAX(CASE WHEN rn = 2 THEN days end) OVER (PARTITION BY myfield) days
from   interim_results;

暫無
暫無

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

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