[英]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.