這是我的查詢:
UPDATE CIELA_STATUS
SET CIELA_STATUS.OSIGURENI = (
SELECT STG5.OSIGURENI
FROM CIELA_STATUS_STG5 STG5
WHERE CIELA_STATUS.UIC = STG5.UIC)
WHERE EXISTS (
SELECT STG5.OSIGURENI
FROM CIELA_STATUS_STG5 STG5
WHERE CIELA_STATUS.UIC = STG5.UIC
AND nvL(CIELA_STATUS.OSIGURENI, 9999) <> STG5.OSIGURENI)
uj5u.com熱心網友回復:
正如錯誤所說,用于set更新列的子查詢產生了不止一行。
最可能的解釋是該UIC列不是表中的主鍵/唯一鍵CIELA_STATUS_STG5
快速檢查
select UIC, count(*)
from CIELA_STATUS_STG5
group by UIC
having count(*) > 1
您將看到重復的密鑰,您必須決定如何恢復。例如洗掉重復項,或僅MAX在更新中使用值或使用最新/最舊的行等。
注意 - 為了更集中地選擇重復項,因為您不在CIELA_STATUS_STG5更新中使用整個表,所以請使用此查詢,這與更新中使用的限制相同:
SELECT
STG5.UIC, count(*) cnt
FROM CIELA_STATUS_STG5 STG5
WHERE STG5.UIC IN (
SELECT CIELA_STATUS.UIC
FROM CIELA_STATUS
WHERE EXISTS
(SELECT STG5.OSIGURENI
FROM CIELA_STATUS_STG5 STG5
WHERE CIELA_STATUS.UIC = STG5.UIC
AND nvL(CIELA_STATUS.OSIGURENI,9999) <> STG5.OSIGURENI)
)
GROUP BY STG5.UIC
HAVING count(*) > 1;
uj5u.com熱心網友回復:
問題是您查詢的這一部分:
SELECT STG5.OSIGURENI
FROM CIELA_STATUS_STG5 STG5
WHERE CIELA_STATUS.UIC = STG5.UIC
正在回傳多行。您需要一種方法從眾多行中準確地選擇一行用于插入。
如果它給出了可接受的結果,最簡單的方法是使用MIN()or MAX():
SELECT MAX(STG5.OSIGURENI)
FROM CIELA_STATUS_STG5 STG5
WHERE CIELA_STATUS.UIC = STG5.UIC
因此,您的整個查詢將是:
UPDATE CIELA_STATUS
SET CIELA_STATUS.OSIGURENI = (
SELECT MAX(STG5.OSIGURENI)
FROM CIELA_STATUS_STG5 STG5
WHERE CIELA_STATUS.UIC = STG5.UIC)
WHERE EXISTS (
SELECT STG5.OSIGURENI
FROM CIELA_STATUS_STG5 STG5
WHERE CIELA_STATUS.UIC = STG5.UIC
AND nvL(CIELA_STATUS.OSIGURENI, 9999) <> STG5.OSIGURENI)
如果MAX()沒有給出正確的結果,您將不得不設計一個查詢,從許多匹配的行中選擇適當的行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/407697.html
標籤:
