簡體   English   中英

ORACLE ORA-00904: 無效標識符錯誤

[英]ORACLE ORA-00904: invalid identifier error

試圖獲取第二個到最后一個部分的狀態,但在子查詢中的my_p上識別出無效。 怎么了?

SELECT  part AS my_p
       ,CASE WHEN ((SELECT MAX(status) AS status
                      FROM (SELECT status,
                                   TO_CHAR(jn_datetime, 'DD-MON-YYYY HH24:MI:SS'),
                                       RANK() OVER(ORDER BY TO_DATE(TO_CHAR(jn_datetime, 'DD-MON-YYYY HH24:MI:SS'), 'DD-MON-YYYY HH24:MI:SS') DESC) my_row_num
                              FROM master 
                             WHERE part = my_p 
                            )
                      WHERE  my_row_num = 2
                        AND  ROWNUM < 2)) = 'I' THEN 'OK'
        END
  FROM  tab1;

您可以像這樣重新排列查詢

SELECT  part AS my_p,
        CASE WHEN ( SELECT MAX(status) AS status
                      FROM (SELECT status, part,
                                   RANK() OVER (PARTITION BY part 
                                                ORDER BY jn_datetime DESC) AS my_row_num
                              FROM master                              
                            )
                      WHERE my_row_num = 2
                        AND ROWNUM < 2
                        AND part = t1.part ) = 'I' 
             THEN 'OK'
          END AS status
  FROM  tab1 t1

為了防止由於在這種情況下未嵌套的相關子查詢而導致的錯誤。 順便說一句,如果此列是日期或時間戳類型列,則jn_datetime遞歸轉換TO_CHAR()TO_DATE()沒有意義。 TO_CHAR(jn_datetime, 'DD-MON-YYYY HH24:MI:SS')是多余的。

您不能在同一個查詢中引用列別名 - my_p - 除了在 order-by 子句中,除非它在它定義的子查詢之外(就像你對my_rownum所做的my_rownum )。 您正在嘗試在尚未真正定義的內部子查詢中使用它。

您可以給最外面的tab1一個表別名並引用它,但正如戈登提到的那樣,嵌套級別存在問題,部分取決於您使用的版本。 (它在11gR2 中仍然失敗,但在18c 中有效;我忘記了在 12cR1 或 12cR2 中是否發生了變化。)

它也沒有真正使 send 將jn_datetime轉換為字符串,然后再返回到日期。

你可能想要這樣的東西:

WITH cte (part, status, my_row_num) AS (
  SELECT part,
    status,
    DENSE_RANK() OVER (PARTITION BY part ORDER BY jn_datetime DESC)
  FROM master
)
SELECT t.part,
  cte.status,
  CASE WHEN cte.status = 'I' THEN 'OK' END AS flag
FROM tab1 t
LEFT JOIN cte ON cte.part = t.part AND cte.my_row_num = 2;

但如果沒有樣本數據和結果,就很難說。

db<>根據我認為您在做什么、您的原始查詢、此查詢以及只是為了好玩,@Barbaros 的查詢, 擺弄一些簡短的虛構數據。

如果一個零件可以有兩個具有相同日期/時間的master行,您可能需要對此進行優化。

        CASE WHEN ( SELECT MAX(status) AS status
                      FROM (SELECT status, part,
                                   RANK() OVER (PARTITION BY part 
                                                ORDER BY jn_datetime DESC) AS my_row_num
                              FROM master                              
                            )
                      WHERE my_row_num = 2
                        AND ROWNUM < 2
                        AND part = t1.part ) = 'I' 
             THEN 'OK'
          END AS status
  FROM  tab1 t1

暫無
暫無

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

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