ORA-01427問題的分析和解決
前幾天開發的同事反饋一個問題,說前臺系統報出了ORA錯誤,希望我們能看看是什麼原因。
java.sql.SQLException: ORA-01427: single-row subquery returns more than one row
我一看到這個錯誤的第一反應就是應該是sql語句的問題,然後開發同事反饋這個程式已經用了蠻長時間了,現在突然報出了錯誤。
簡單溝通之後,我得到了對應的sql語句。
SELECT ID, PROJECTNAME, GRAPH, TYPE, PERSON, RECORDTIME, PROJECTURL , ICON, GO, COLOR, LOCATION, MANAGER ,
(SELECT NAME FROM app_iwork.WS_PRIVILEGE_NODE WHERE MENUID = pro.projectkey ) KEYNAME
FROM app_iwork.WS_TEST_PROJECT pro
WHERE TYPE = '495' ORDER BY LOCATION ASC ,ID DESC
從sql語句能夠猜出來錯誤應該是從子查詢裡返回的。
(SELECT NAME FROM app_iwork.WS_PRIVILEGE_NODE WHERE MENUID = pro.projectkey )
我們來看看這個語句,按照ORA-01427的錯誤,應該是這個子查詢返回了多行值。
簡單來驗證一下,首先根據type='495'能夠得到下面的查詢結果
select projectkey from app_iwork.WS_TEST_PROJECT pro WHERE TYPE = '495'
PROJECTKEY
--------------------------------------------------
1557739
1516023
1577799
374871
1584374
和開發同事簡單溝通,這個表中還是存在部分的髒資料,修改之後,問題就解決了。
如果對這個問題進一步改進,可以在確認這個表結構的基礎上,看看能夠新增相應的約束,這樣也能夠保證表中的資料不會存在冗餘,避免後續出現此類的問題。
java.sql.SQLException: ORA-01427: single-row subquery returns more than one row
我一看到這個錯誤的第一反應就是應該是sql語句的問題,然後開發同事反饋這個程式已經用了蠻長時間了,現在突然報出了錯誤。
簡單溝通之後,我得到了對應的sql語句。
SELECT ID, PROJECTNAME, GRAPH, TYPE, PERSON, RECORDTIME, PROJECTURL , ICON, GO, COLOR, LOCATION, MANAGER ,
(SELECT NAME FROM app_iwork.WS_PRIVILEGE_NODE WHERE MENUID = pro.projectkey ) KEYNAME
FROM app_iwork.WS_TEST_PROJECT pro
WHERE TYPE = '495' ORDER BY LOCATION ASC ,ID DESC
從sql語句能夠猜出來錯誤應該是從子查詢裡返回的。
(SELECT NAME FROM app_iwork.WS_PRIVILEGE_NODE WHERE MENUID = pro.projectkey )
我們來看看這個語句,按照ORA-01427的錯誤,應該是這個子查詢返回了多行值。
簡單來驗證一下,首先根據type='495'能夠得到下面的查詢結果
select projectkey from app_iwork.WS_TEST_PROJECT pro WHERE TYPE = '495'
PROJECTKEY
--------------------------------------------------
1557739
1516023
1577799
374871
1584374
取出任意一條,然後按照兩個表的關聯欄位值查詢,可以看到輸出了3行資料。
SQL> SELECT NAME FROM app_iwork.WS_PRIVILEGE_NODE WHERE MENUID = 1557739;
NAME
--------------------------------------------------------------------------------
分析系統
分析系統
分析系統
所以這種情況的解決方案有幾種。
SELECT ID, PROJECTNAME, GRAPH, TYPE, PERSON, RECORDTIME, PROJECTURL , ICON, GO, COLOR, LOCATION, MANAGER , n.name
FROM app_iwork.WS_TEST_PROJECT pro ,app_iwork.WS_PRIVILEGE_NODE n
WHERE MENUID = pro.projectkey and TYPE = '495' ORDER BY LOCATION ASC ,ID DESC
這種方式可以輸出結果而不會報錯,儘管存在冗餘資料,但是也不推薦。
另外一種思路就是在子查詢中進行重複值的過濾,使用group by來完成。
SELECT ID, PROJECTNAME, GRAPH, TYPE, PERSON, RECORDTIME, PROJECTURL , ICON, GO, COLOR, LOCATION, MANAGER ,
(SELECT NAME FROM app_iwork.WS_PRIVILEGE_NODE WHERE MENUID = pro.projectkey group by name ) KEYNAME
FROM app_iwork.WS_TEST_PROJECT pro
WHERE TYPE = '495' ORDER BY LOCATION ASC ,ID DESC
還有一種思路就是和開發確認,刪除冗餘的資料,這種方案不用修改程式碼,還是相對來說可以實現的一種方式。SQL> SELECT NAME FROM app_iwork.WS_PRIVILEGE_NODE WHERE MENUID = 1557739;
NAME
--------------------------------------------------------------------------------
分析系統
分析系統
分析系統
所以這種情況的解決方案有幾種。
SELECT ID, PROJECTNAME, GRAPH, TYPE, PERSON, RECORDTIME, PROJECTURL , ICON, GO, COLOR, LOCATION, MANAGER , n.name
FROM app_iwork.WS_TEST_PROJECT pro ,app_iwork.WS_PRIVILEGE_NODE n
WHERE MENUID = pro.projectkey and TYPE = '495' ORDER BY LOCATION ASC ,ID DESC
這種方式可以輸出結果而不會報錯,儘管存在冗餘資料,但是也不推薦。
另外一種思路就是在子查詢中進行重複值的過濾,使用group by來完成。
SELECT ID, PROJECTNAME, GRAPH, TYPE, PERSON, RECORDTIME, PROJECTURL , ICON, GO, COLOR, LOCATION, MANAGER ,
(SELECT NAME FROM app_iwork.WS_PRIVILEGE_NODE WHERE MENUID = pro.projectkey group by name ) KEYNAME
FROM app_iwork.WS_TEST_PROJECT pro
WHERE TYPE = '495' ORDER BY LOCATION ASC ,ID DESC
和開發同事簡單溝通,這個表中還是存在部分的髒資料,修改之後,問題就解決了。
如果對這個問題進一步改進,可以在確認這個表結構的基礎上,看看能夠新增相應的約束,這樣也能夠保證表中的資料不會存在冗餘,避免後續出現此類的問題。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-1792019/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ActiveMQ問題分析和解決MQ
- MyCAT的常見問題分析和解決
- JAVA中文比較問題的分析和解決 (轉)Java
- Oracle 惡意攻擊問題分析和解決(一)Oracle
- Oracle資料不同步的問題分析和解決思路Oracle
- 關於ORA-01779問題的分析和解決
- dataguard中MRP無法啟動的問題分析和解決
- redis分散式鎖的問題和解決Redis分散式
- 最近遇到的問題和解決辦法
- Redis 常見的效能問題和解決方法Redis
- nginx和Tomcat整合後發生的重定向問題分析和解決NginxTomcat
- 透徹分析和解決一切javaWeb專案亂碼問題JavaWeb
- discuz雲平臺報呼叫遠端介面失敗的問題分析和解決
- Redis常見的效能問題和解決方法UWRedis
- oracle net相關問題的彙總和解決Oracle
- 浮動元素引起的問題和解決辦法?
- 浮動元素引起的問題和解決辦法
- 檢測和解決Android應用的效能問題Android
- Tomcat中文亂碼問題的原理和解決方法Tomcat
- Spark 環境問題記錄和解決方法Spark
- 如何診斷和解決db2問題DB2
- Firefox 使用常見問題和解決方法Firefox
- 最新 IDEA 和 Maven 整合問題和解決IdeaMaven
- 設定SecureCRT配色和解決亂碼問題Securecrt
- Redis常見問題和解決辦法梳理Redis
- Composer 使用過程中遇到的問題和解決方案
- composer依賴相關的問題和解決辦法
- Pentaho 使用中發現的幾個問題和解決方法
- 刪除一個使用者遇到的問題和解決
- 診斷和解決CPU利用率高的問題(zt)
- GT911驅動遇到的問題和解決方案
- 雲端遷移過程中的技術問題和解決思路
- MVVM框架從WPF移植到UWP遇到的問題和解決方法MVVM框架
- SQL安裝過程式中的常問題和解決辦法SQL
- android中The connection to adb is down,問題和解決Android
- linux Too Many Files 問題檢視和解決方法Linux
- ElasticSearch啟動失敗問題彙總和解決方法Elasticsearch
- Spring原始碼分析(三)手寫簡單的IOC容器和解決迴圈依賴問題Spring原始碼