Update query - ora-01427 error [message #351708] |
Thu, 02 October 2008 10:45 |
chrysalid
Messages: 4 Registered: October 2008
|
Junior Member |
|
|
Hello,
I'm trying to run an update query, to replace all rows with a null date value, with a date from another table.
I get an ora-01427 error when I try to run the query.
I realize that the reason I get this is because there is >1 row being returned - but there are >1 records I need updated.
I'm thinking I need to use 'IN' instead of '=' but not sure how...
I've pasted my code below and attached a .pdf explanation (it's quite confusing).
Thanks in advance!!
Amber
UPDATE SILVICULTURE_ACTIVITY
SET SILA_START_DATE = (SELECT SILVICULTURE_AMENDMENT.SAMM_DIST_APPR_DATE
FROM
SILVICULTURE_ACTIVITY,
SILVICULTURE_COMPANY_ACTIVITY,
SILVICULTURE_AMENDMENT,
SILVICULTURE_PRESCRIPTION,
CUT_BLOCK
WHERE
SILVICULTURE_ACTIVITY.SICA_SEQ_NBR = SILVICULTURE_COMPANY_ACTIVITY.SICA_SEQ_NBR AND
SILVICULTURE_ACTIVITY.CUTB_SEQ_NBR = SILVICULTURE_PRESCRIPTION.CUTB_SEQ_NBR AND
SILVICULTURE_AMENDMENT.SILP_SEQ_NBR = SILVICULTURE_PRESCRIPTION.SILP_SEQ_NBR AND
SILVICULTURE_PRESCRIPTION.CUTB_SEQ_NBR = CUT_BLOCK.CUTB_SEQ_NBR AND
SICA_ACTIVITY_NAME = 'SP' AND
SILVICULTURE_AMENDMENT.SAMM_DIST_APPR_DATE IS NOT NULL)
WHERE
SILA_STATUS = 'P' AND SILA_START_DATE IS NULL AND
/
-
Attachment: SQL_exp.pdf
(Size: 46.19KB, Downloaded 1082 times)
|
|
|
Re: Update query - ora-01427 error [message #351713 is a reply to message #351708] |
Thu, 02 October 2008 12:52 |
joy_division
Messages: 4963 Registered: February 2005 Location: East Coast USA
|
Senior Member |
|
|
You are correct in your assumption, but the root of the problem is Oracle does not know which record in the lookup query to use to update your record. How would you know which one to use? You need to define a one to one relationship or use an aggregate function.
[added] and your update statement is invalid.
[Updated on: Thu, 02 October 2008 12:53] Report message to a moderator
|
|
|
Re: Update query - ora-01427 error [message #351717 is a reply to message #351708] |
Thu, 02 October 2008 14:00 |
joicejohn
Messages: 327 Registered: March 2008 Location: India
|
Senior Member |
|
|
@chrysalid,
chrysalid wrote on Thu, 02 October 2008 21:15 |
I'm thinking I need to use 'IN' instead of '=' but not sure how...
|
Replacing '=' with 'IN' also won't work. I thought its a wrong syntax in an UPDATE statement.
CREATE TABLE tab_1
(
Col_1 VARCHAR2(10)
);
INSERT INTO tab_1 VALUES ('A');
INSERT INTO tab_1 VALUES ('B');
SELECT * from tab_1;
Col_1
----------
A
B
CREATE TABLE tab_2
(
Col_2 VARCHAR2(10)
);
INSERT INTO tab_2 VALUES ('C');
INSERT INTO tab_2 VALUES ('D');
INSERT INTO tab_2 VALUES ('E');
INSERT INTO tab_2 VALUES ('F');
SELECT * from tab_2;
Col_2
----------
C
D
E
F
Now,
UPDATE tab_1
SET col_1 = (SELECT col_2 FROM tab_2)
where col_1 = 'A';
ORA-01427: single-row-subquery returns more than one row
UPDATE tab_1
SET col_1 IN (SELECT col_2 FROM tab_2)
where col_1 = 'A';
ORA-00927: missing equal sign
chrysalid wrote on Thu, 02 October 2008 21:15 |
SILA_STATUS = 'P' AND SILA_START_DATE IS NULL AND
/
|
Guess your update statement is incomplete.
Anyways can you check if CUTB_SEQ_NBR in your PRESCRIPTION table(Foreign Key in that table) is unique? (I doubt it to be unique though). Same thing will go for SLIP_SEQ_NBR in your AMENDMENT table. If they are not unique, many to many relationship (bad relationship. Might end up in Cartesian Product) occurs through the joins you have given from all the way from ACTIVITY table to AMENDMENT table.
Also note that if the AMANDMENT table (source for your update table ACTIVITY) has a "many-end" of the relationship you will get the same error unless you restrict the number of records to one(by using aggregate functions might help).
Hope this helps.
Finally, Please read OraFAQ Forum Guide before posting.
Regards,
Jo
[Didn't see @joydivision's reply]
[Updated on: Thu, 02 October 2008 14:05] Report message to a moderator
|
|
|
Re: Update query - ora-01427 error [message #352446 is a reply to message #351717] |
Tue, 07 October 2008 13:16 |
chrysalid
Messages: 4 Registered: October 2008
|
Junior Member |
|
|
Okay, I took a few days off and am now back to trying to sort this out.
One thing I realized is that I'm missing one more criteria - if I add:
AND SILVICULTURE_AMENDMENT.SAMM_AMENDMENT_NBR = '0'
to my SQL, I will only ever return a single SAMM_DIST_APPR_DATE for each SILA_START_DATE.
Does this make sense?
Now I have a 1 to 1 relationship, but my inside sub-query is still pulling multiple records.
Not sure how I make this work.
And regarding the suggestion to read the Forum Guide - what did I do wrong?
Thanks for your help!
Amber
|
|
|
Re: Update query - ora-01427 error [message #352454 is a reply to message #352446] |
Tue, 07 October 2008 15:34 |
joy_division
Messages: 4963 Registered: February 2005 Location: East Coast USA
|
Senior Member |
|
|
chrysalid wrote on Tue, 07 October 2008 14:16 | if I add:
AND SILVICULTURE_AMENDMENT.SAMM_AMENDMENT_NBR = '0'
to my SQL, I will only ever return a single SAMM_DIST_APPR_DATE for each SILA_START_DATE.
|
If you are still getting the error then you are incorrect by saying this.
Your understanding of the process I believe is incorrect. It's your join condition that needs to be one to one, not a one to one relationship of the column to be updated.
[Updated on: Tue, 07 October 2008 15:36] Report message to a moderator
|
|
|
Re: Update query - ora-01427 error [message #352455 is a reply to message #352454] |
Tue, 07 October 2008 15:53 |
chrysalid
Messages: 4 Registered: October 2008
|
Junior Member |
|
|
Yes - I am aware that I don't know how to do it - that is why I'm posting here.
What I'm trying to make clear is that there IS a 1-to-1 relationship between the two fields, explained in my select query.
What I don't understand, is how to take that select statement, and make an update statement.
I tried to put something together on my own - and have had no luck.
I came here to find some help, not to have it pointed out to me that it's wrong - without ever getting suggestions on how to correct it...
|
|
|
|
|
|