簡體   English   中英

在過程中使用表別名的ORA-01427

[英]ORA-01427 with table alias used in Procedure

我在存儲過程中有以下代碼片段:

(請注意,這不是原始代碼段,但與之完全相似,只是表和列名已替換為更通用的名稱,以便於更好地理解並防止泄露客戶端代碼。)

UPDATE table_Orders c SET order_type = 
(
SELECT 'PE' FROM 
table_Orders A, 
table_Orders b, 
(SELECT DISTINCT order_id, cust_id, order_date FROM table_Orders WHERE shipment_type = 'T' AND order_availability = 'P' AND order_amt > 500 
AND cust_category = 'PREMIUM' ) d 
WHERE
A.order_id = d.order_id AND A.order_date = d.order_date AND A.cust_id= d.cust_id
AND A.order_id = b.order_id AND A.order_date = b.order_date AND A.cust_id= b.cust_id
AND A.shipment_type = b.shipment_type AND A.order_availability = b.order_availability AND A.product_id <> b.product_id
AND ((A.order_amt > 500 AND b.shipment_amt > 50) OR (A.shipment_amt > 50 AND b.order_amt > 500))
AND A.order_id = c.order_id AND A.order_date = c.order_date AND A.cust_id = c.cust_id 
AND A.shipment_type = c.shipment_type AND  A.order_availability = c.order_availability AND A.product_id = c.product_id 
);
COMMIT;

現在,我的問題是我在執行過程時遇到錯誤ORA-01427 single-row subquery returns more than one row的錯誤。 我嘗試使用如下的IN子句將子查詢放在語句的末尾,但即使這樣也不起作用:

UPDATE table_Orders c SET order_type =
(
SELECT 'PE' FROM 
table_Orders A, 
table_Orders b
WHERE
A.order_id = d.order_id AND A.order_date = d.order_date AND A.cust_id= d.cust_id
AND A.order_id = b.order_id AND A.order_date = b.order_date AND A.cust_id= b.cust_id
AND A.shipment_type = b.shipment_type AND A.order_availability = b.order_availability AND A.product_id <> b.product_id
AND ((A.order_amt > 500 AND b.shipment_amt > 50) OR (A.shipment_amt > 50 AND b.order_amt > 500))
AND A.order_id = c.order_id AND A.order_date = c.order_date AND A.cust_id = c.cust_id 
AND A.shipment_type = c.shipment_type AND  A.order_availability = c.order_availability AND A.product_id = c.product_id 
AND (A.order_id, A.cust_id, A.order_date) IN
(SELECT DISTINCT order_id, cust_id, order_date FROM table_Orders 
    WHERE shipment_type = 'T' AND order_availability = 'P' AND order_amt > 500 AND cust_category = 'PREMIUM')
);
COMMIT;

有人可以在正確的方向上引導我,例如我在哪里弄亂它,或者子查詢已經被弄亂了嗎?

帶JOIN的代碼->這樣就在“ JOIN”語句之前的c.product_Id處缺少右括號

UPDATE table_Orders c SET order_type =
(
 SELECT 'PE' FROM 
table_Orders A, 
table_Orders b
WHERE
A.order_id = d.order_id AND A.order_date = d.order_date AND A.cust_id= d.cust_id
AND A.order_id = b.order_id AND A.order_date = b.order_date AND A.cust_id= b.cust_id
AND A.shipment_type = b.shipment_type AND A.order_availability = b.order_availability AND A.product_id <> b.product_id
AND ((A.order_amt > 500 AND b.shipment_amt > 50) OR (A.shipment_amt > 50 AND b.order_amt > 500))
AND A.order_id = c.order_id AND A.order_date = c.order_date AND A.cust_id = c.cust_id 
AND A.shipment_type = c.shipment_type AND  A.order_availability = c.order_availability AND A.product_id = c.product_id 
JOIN
SELECT DISTINCT order_id, cust_id, order_date FROM table_Orders 
WHERE shipment_type = 'T' AND order_availability = 'P' AND order_amt > 500 AND cust_category = 'PREMIUM' d
ON A.order_id = d.order_id AND A.order_date = d.order_date AND A.cust_id= d.cust_id
COMMIT;

對於某些c.order_id, c.order_date, c.cust_id, c.shipment_type, c.order_availability, c.product_id子查詢可能返回多個行

在不知道您的表結構和數據的情況下,我們很難分辨。

但是您可以執行以下操作:

UPDATE table_Orders c SET order_type = 'PE'
WHERE (c.order_id, c.order_date, c.cust_id, c.shipment_type, c.order_availability, c.product_id) IN 
(
SELECT A.order_id, A.order_date, A.cust_id, A.shipment_type, A.order_availability, A.product_id 
FROM 
table_Orders A, 
table_Orders b, 
(SELECT DISTINCT order_id, cust_id, order_date FROM table_Orders WHERE shipment_type = 'T' AND order_availability = 'P' AND order_amt > 500 
AND cust_category = 'PREMIUM' ) d 
WHERE
A.order_id = d.order_id AND A.order_date = d.order_date AND A.cust_id= d.cust_id
AND A.order_id = b.order_id AND A.order_date = b.order_date AND A.cust_id= b.cust_id
AND A.shipment_type = b.shipment_type AND A.order_availability = b.order_availability AND A.product_id <> b.product_id
AND ((A.order_amt > 500 AND b.shipment_amt > 50) OR (A.shipment_amt > 50 AND b.order_amt > 500))
);

COMMIT;

順便說一句,為什么不使用“ JOIN語法”?


UPDATE相同的解決方案,但具有ANSI連接語法:

UPDATE table_Orders c 
   SET order_type = 'PE'
 WHERE (c.order_id, c.order_date, c.cust_id, c.shipment_type, c.order_availability, c.product_id) IN 
(
SELECT A.order_id, A.order_date, A.cust_id, A.shipment_type, A.order_availability, A.product_id 
FROM 
table_Orders A 
JOIN 
table_Orders b ON A.order_id = b.order_id AND A.order_date = b.order_date AND A.cust_id= b.cust_id AND A.shipment_type = b.shipment_type AND A.order_availability = b.order_availability AND A.product_id <> b.product_id 
JOIN 
(SELECT DISTINCT order_id, cust_id, order_date FROM table_Orders WHERE shipment_type = 'T' AND order_availability = 'P' AND order_amt > 500 
AND cust_category = 'PREMIUM' ) d ON A.order_id = d.order_id AND A.order_date = d.order_date AND A.cust_id= d.cust_id
WHERE ((A.order_amt > 500 AND b.shipment_amt > 50) OR (A.shipment_amt > 50 AND b.order_amt > 500))
);

暫無
暫無

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

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