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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle 惡意攻擊問題分析和解決(一)Oracle
- Oracle資料不同步的問題分析和解決思路Oracle
- redis分散式鎖的問題和解決Redis分散式
- 粘包問題原因和解決方法
- 『分析和解決問題的7種武器』今日資料行業日報(2019.08.16)行業
- 透徹分析和解決一切javaWeb專案亂碼問題JavaWeb
- Redis常見的效能問題和解決方法UWRedis
- Firefox 使用常見問題和解決方法Firefox
- android中The connection to adb is down,問題和解決Android
- 最新 IDEA 和 Maven 整合問題和解決IdeaMaven
- Debian 11 關閉 swap 遇到的問題和解決方案
- GT911驅動遇到的問題和解決方案
- Composer 使用過程中遇到的問題和解決方案
- 浮動元素引起的問題和解決辦法?
- composer依賴相關的問題和解決辦法
- 浮動元素引起的問題和解決辦法
- Spark 環境問題記錄和解決方法Spark
- 如何診斷和解決db2問題DB2
- linux Too Many Files 問題檢視和解決方法Linux
- Spring原始碼分析(三)手寫簡單的IOC容器和解決迴圈依賴問題Spring原始碼
- 有關 Android Studio 重複引入包的問題和解決方案Android
- feign之間傳遞oauth2-token的問題和解決OAuth
- xxl-job濫用netty導致的問題和解決方案Netty
- 雲端遷移過程中的技術問題和解決思路
- SpringBoot使用IDEA設定的外部Tomcat啟動,遇到的問題和解決Spring BootIdeaTomcat
- 排查和解決 CentOS 伺服器磁碟空間不足問題CentOS伺服器
- 資料庫檔案複製問題和解決辦法資料庫
- Windows作業系統常見故障問題和解決方案Windows作業系統
- 優思學院|精益生產的各種問題和解決方案
- 深刻理解JAVA併發中的有序性問題和解決之道Java
- 社交電商系統開發時的常見問題和解決方法
- Ubuntu 常見問題和解答Ubuntu
- 在Linux中,如何診斷和解決系統啟動問題?Linux
- 一軟一硬:記錄我的工作電腦兩次出現效能問題的分析思路和解決過程
- Salesforce LWC學習(三十九) lwc下quick action的recordId的問題和解決方案SalesforceUI
- 網聯汽車的資訊保安問題有哪些?如何規避和解決?
- 由VIP漂移引發的演算法異常問題調查和解決演算法
- 專案管理中的需求變更分析和解決之道專案管理
- android 藍芽耳機雜音和耳機相容性問題是什麼原因?如何分析和解決?Android藍芽