Question

UPDATE DATA IN ONE TABLE FROM ANOTHER USING A SELECT STATEMENT

Asked by: ewgf2002

I am trying to use the following code to update data from one table and put that data from the select statement into another table.  The code is as follows:

update invcost a
set a.glaccount = (select b.GLACCOUNT from nventory b
                 where a.ITEMNUM = b.ITEMNUM
                 and b.GLACCOUNT is not null)
where exists
                 (select 1 from inventory b
                 where a.ITEMNUM = b.ITEMNUM
                 and b.GLACCOUNT is not null )
and a.glaccount is null

THE ISSUE IS I AM GETTING ORA-01427: single-row subquery returns more than one row.

I am assuming this is because the values in the table from the select has more than one value.  For example:  The glaccount field in inventory is either, 1234, 5678, 9101, 3214.

I need to update the fields in invcost to the same values in inventory.

This Question has been solved and asker verified All Experts Exchange premium technology solutions are available to subscription members.

Subscribe now for full access to Experts Exchange and get

Instant Access to this Solution

  • Plus...
  • 30 Day FREE access, no risk, no obligation
  • Collaborate with the world's top tech experts
  • Unlimited access to our exclusive solution database
  • Never be left without tech help again

Subscribe Now

Asked On
2009-04-22 at 11:16:13ID24346301
Topics

PL / SQL

,

Databases Miscellaneous

Participating Experts
3
Points
500
Comments
27

Trusted by hundreds of thousands everyday for fast, accurate and reliable tech support.

  • "The time we save is the biggest benefit of Experts Exchange to Warner Bros. What could take multiple guys 2 hours or more each to find is accessed in around 15 minutes on Experts Exchange." Mike Kapnisakis, Warner Bros.
  • "Our team likes having a resource that is more secure than just using Google and most experts using this service really know their stuff. It's nice to look here first versus using Google." Dayna Sellner, Lockheed Martin
  • "Anytime that I've been stumped with a problem, 9 out of 10 times Experts Exchange has either the accepted solution or an open discussion of the potential solution to the problem." Kenny Red, eBay Inc.

See what Experts Exchange can do for you.

Got a question?

We've got the answer.

Experts Exchange has been collecting answers to technology questions since 1996…3 million and counting! If you have a question, chances are we already have your answer.

Screenshot of Experts Exchange Knowledgebase

Need individual assistance?

Our experts are ready to help.

If you can't find the exact answer you're looking for, ask our exclusive community of 50,000 experts. You’ll get a personalized answer from a trusted professional.

Screenshot of Experts Exchange Knowledgebase

Want to learn from the best?

Read articles from industry experts.

Thousands of free tech tips, tricks, how-to’s and tutorials are available in our peer reviewed articles section. See for yourself how smart our experts are, no login required.

Screenshot of an Article

Working on a long term project?

Store your work and research.

Save solutions to your questions, answers you’ve discovered through searching plus helpful articles in your personal knowledgebase for easy future access.

Screenshot of Experts Exchange Knowledgebase

Access the answers to your technology questions today.

Subscribe Now

30-day free trial. Register in 60 seconds.

What Makes Experts Exchange Unique?

Members of the expert community talk about why the experience at Experts Exchange is different than what you will find anywhere else.

Trusted by the world's most respected brands.

image of each brand's logo

Faithfully serving IT professionals since 1996.

Experts Exchange Logo

Try it out and discover for yourself.

Subscribe Now

30-day free trial. Register in 60 seconds.

Related Solutions

  1. Inventory System
    I?m trying to design an inventory system and have the following tables and views for the required application: TRANSACTION TABLE ITEM_CODE varchar2(20) PARTICULARS varchar2(40) RECEIVED_DATE date RECEIVED number ISSUED number BALANCE number TIME_STAMP varchar2(20) Now...
  2. subqueries
    i have a table DTEC with the following columns: ========== firm_code data1 data2 tec_date bl_date criteria1 criteria2 and my query looks like this: select firm_code, sum(data1), sum(data2) where bl_date>='adate' and bl_date<='bdate' and criteria1='q' and criteria2 != ...
  3. Subquery in a select statement... seems impossible!
    I wrote a select statement that is be used to get some data from the database in a specific format. Part of it fails. I've narrowed it down to this portion: select tac_oid,',',(select mdc.mdc,';' from mdc where mdc.tac_oid = tac.tac_oid) from tac where tac = 'CAA4'; I would...
  4. Subquery of subquery in oracle select statement
    In the query below on the second case statement i need to some how return the second row in the subquery and i have no idea how to achieve what i'm needing to do in oracle. Select held.REG_DESC, held.TRN_SCTN_ID, held.TRN_SYMB, held.TRN_DAY, held.TRN_DATE, held....

Free Tech Articles

  1. WARNING: 5 Reasons why you should NEVER fix a computer for free.
    It is in our nature to love the puzzle. We are obsessed. The lot of us. We love puzzles. We love the challenge. We thrive on finding the answer. We hate disarray. It bothers us deep in our soul. W...
  2. SCCM OSD Basic troubleshooting
    SCCM 2007 OSD is a fantastic way to deploy operating systems, however, like most things SCCM issues can sometimes be difficult to resolve due to the sheer volume of logs to sift through and the dispe...
  3. Migrate Small Business Server 2003 to Exchange 2010 and Windows 2008 R2
    This guide is intended to provide step by step instructions on how to migrate from Small Business Server 2003 to Windows 2008 R2 with Exchange 2010. For this migration to work you will need the fo...
  4. Create a Win7 Gadget
    This article shows you how to create a simple "Gadget" -- a sort of mini-application supported by Windows 7 and Vista. Gadgets can be dropped anywhere on the desktop to provide instant information, ...
  5. Outlook continually prompting for username and password
    There have been a lot of questions recently regarding Outlook prompting for a username and password whilst using Exchange 2007. There are a few reasons why this would happen and I will try to cover t...
  6. Backup Exchange 2010 Information Store using Windows Backup
    There seems to be quite a lot of confusion around the ability to backup Exchange 2010 using the built in Windows Backup feature. This stems from the omission of this feature prior to Exchange 2007 s...

Cloud Class Webinars

  1. Avoiding Bugs in Microsoft Access
    Alison Balter takes and in-depth look at avoiding bugs in Access. In this webinar you will learn about using the immediate window to debug your applications, invoking the debugger, using breakpoints to troubleshoot, stepping through code, setting the next statement to execute, ...
  2. Top 10 Best New Features in Visio 2010
    Scott Helmers gives live demonstrations of the top 10 new features in Visio 2010. This webinar will teach you how to create compelling diagrams by adding shapes to the page with a single click, linking the shapes in a diagram to data in Excel (or SQL Server, or SharePoint), ...
  3. IT Consultant Business Secrets Revealed
    Michael Munger, Experts Exchange tech pro and IT consultant, pulls back the curtain on his very successful businesses and answers question on every IT consultant and business owner should know about. He shares secrets on what he did to solve the 5 most common problems in IT, ...
  4. Disaster Recovery and Business Continuity
    Quest CTO, Mike Billon, gives an overview of the steps involved in building a dunamic disaster recovery plan. Through case studies and an examination of software/hardware tooles for monitoring and testing, you'll gain a better understandin of where you are, where you want ...
  5. Organize Your Visio Diagrams with Containers and Lists
    Scott Helmers uses cross functional flowcharts, wireframe diagrams, data graphic legends and seating charts to teach you: how to ustilize all three new structured diagram components in Visio 2010, the best practices for organizeing shapes in previous version of Visio, how to organize ...
  6. How to Us Objects, Properties, Events and Methods in Microsoft Access
    Alison Dalter gives an in-depbth look at objects, properties, events and methods in Microsoft Access. In this webinar you will learn about using the object browser, referring to objects, working with properties and methods, working with object variables, understanding the ...

Join the Community

Give a Little. Get a Lot.

Join the community of experts here and help other tech pros by answering question in your area of expertise. You can earn FREE access to all Experts Exchange's premium features and resources.

Join the Community

Answers

 

by: pcelbaPosted on 2009-04-22 at 11:29:36ID: 24207982

I am not PL/SQL expert but seems you have several rows with same ITEMNUM in inventory table. Is it right? If yes and GLACCOUNT is same for all these rows, this could work:

update invcost a
set a.glaccount = (select TOP 1 b.GLACCOUNT from inventory b
                 where a.ITEMNUM = b.ITEMNUM
                 and b.GLACCOUNT is not null)
where exists
                 (select 1 from inventory b
                 where a.ITEMNUM = b.ITEMNUM
                 and b.GLACCOUNT is not null )
and a.glaccount is null

 

by: mwvisa1Posted on 2009-04-22 at 11:37:02ID: 24208056

Seems like you need an inner join.  I am not a PL/SQL expert either, but syntax wise it would look something like this.

UPDATE a
SET a.glaccount = b.GLACCOUNT
FROM invcost a
INNER JOIN inventory b ON a.ITEMNUM = b.ITEMNUM AND b.GLACCOUNT is not null
WHERE a.glaccount is null;

 

by: ewgf2002Posted on 2009-04-22 at 11:43:04ID: 24208114

pcelea,  i think the issue is the glaccount is not the same for all rows.

 

by: pcelbaPosted on 2009-04-22 at 11:50:54ID: 24208194

So you should test it because if it is not same then you don't know how to update missing values. If the following query returns some rows then you have to clarify what to update:

select ITEMNUM, COUNT(GLACCOUNT) as glcnt
 from inventory b
where GLACCOUNT is not null
GROUP BY ITEMNUM
HAVING COUNT(GLACCOUNT) > 1

 

by: mwvisa1Posted on 2009-04-22 at 11:52:54ID: 24208206

Did you try my query yet?  That will match on the ITEMNUM from the inventory table which has GLACCOUNT you want and update invcost table accordingly.

 

by: ewgf2002Posted on 2009-04-22 at 11:57:29ID: 24208251

mwvisa1

I got a syntax error when trying to run your query.

 

by: pcelbaPosted on 2009-04-22 at 12:00:32ID: 24208282

The syntax should be:

UPDATE invcost
SET glaccount = b.GLACCOUNT
FROM invcost a
INNER JOIN inventory b ON a.ITEMNUM = b.ITEMNUM AND b.GLACCOUNT is not null
WHERE a.glaccount is null;

 

by: angelIIIPosted on 2009-04-22 at 12:09:36ID: 24208386

to get rid of the error:

update invcost a
set a.glaccount = (select b.GLACCOUNT from nventory b
                 where a.ITEMNUM = b.ITEMNUM
                 and b.GLACCOUNT is not null
                 and rownum = 1)
where exists
                 (select 1 from inventory b
                 where a.ITEMNUM = b.ITEMNUM
                 and b.GLACCOUNT is not null )
and a.glaccount is null
                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:

Select allOpen in new window

 

by: mwvisa1Posted on 2009-04-22 at 12:09:57ID: 24208391

Try this:
http://www.orafaq.com/forum/?t=msg&th=47970/0/

UPDATE 
(SELECT a.glaccount AS oldAccount
, b.glaccount AS newAccount
FROM invcost a
INNER JOIN inventory b ON a.ITEMNUM = b.ITEMNUM AND b.GLACCOUNT is not null
WHERE a.glaccount is null)
SET oldAccount = newAccount;

                                              
1:
2:
3:
4:
5:
6:
7:

Select allOpen in new window

 

by: angelIIIPosted on 2009-04-22 at 12:11:03ID: 24208401

remarks: the TOP 1  or the UPDATE ... JOIN won't work in oracle...

now, if the original query returns that error, it means that for a single ITEMNUM, the query returns several rows.
from there, assuming you get different values of GLACCOUNT, which one should the subquery use for the update?

 

by: mwvisa1Posted on 2009-04-22 at 12:11:36ID: 24208414

Angel Eyes, does Oracle auto recognize the rownum OR is that the result of an analytical row_number() OVER statement?

 

by: pcelbaPosted on 2009-04-22 at 12:16:51ID: 24208474

Thanks for TOP n and rownum clarification (I am more FoxPro than Oracle) but I would say to reduce select output to one row does not solve the problem in the case there are ambigous assignments of GL account to Item Numbers.

If they need just SOME value assigned then it is OK, of course.

 

by: ewgf2002Posted on 2009-04-22 at 12:26:09ID: 24208581

i am using oracle and i am still getting a syntax error.  The glaccounts are different.

 

by: angelIIIPosted on 2009-04-22 at 12:29:16ID: 24208613

>Angel Eyes, does Oracle auto recognize the rownum OR is that the result of an analytical row_number() OVER statement?

oracle has a ROWNUM  syntax (it's not really a function)

>Thanks for TOP n and rownum clarification (I am more FoxPro than Oracle) but I would say to reduce select output to one row does not solve the problem in the case there are ambigous assignments of GL account to Item Numbers.

it does get rid of the runtime error, but as you say correctly, it does not really solve the problem.


>i am using oracle and i am still getting a syntax error.  The glaccounts are different.
then, please, clarify, what value of glaccount should be chosen.
which rule should be applied?

 

by: ewgf2002Posted on 2009-04-22 at 12:33:12ID: 24208649

I need the glaccount from one table to be inserted into the other table.  There is not just one value for the glaccount.

 

by: angelIIIPosted on 2009-04-22 at 12:36:16ID: 24208679

ewgf2002,

  please try to be more collaborative.
  we  did understand that you have different value of glaccount, but, the question is:
  for a single value of ITEMNUM, should it return different value of glaccount also?

  if yes, which 1 (one) of those values should be taken for the update, again, per value of ITEMNUM.

  if you don't understand that question, please post sample data of the 2 tables BEFORE and AFTER the update as you need it to happen.

 

by: ewgf2002Posted on 2009-04-22 at 12:43:15ID: 24208765

angellll,
the answer to your question is yes.  the value that i will need will be from the inventory table.

Example

Inventory table:
itemnum                 glaccount
123                        44444
456                        55555
789                        777777

Current Invost table:
itemnum                 glaccount
123                        
456                        
789                        

Invcost table needs to be updated with the following from the Inventory table:
123                        44444
456                        55555
789                        777777

 

by: mwvisa1Posted on 2009-04-22 at 12:43:41ID: 24208771

Thanks!

 

by: angelIIIPosted on 2009-04-22 at 12:47:18ID: 24208804

if the data is like that, your UPDATE should NOT give you that error.
you must have something like


Inventory table:
itemnum                 glaccount
123                        44444
456                        55555
456                        55555
789                        777777

or

123                        44444
456                        55555
456                        11111
789                        777777


in case 1, my addition of AND ROWNUM = 1 will solve both the error and the problem, as all value of glaccount for itemnum = 456 are effectively the same.

in case 2, you have 2 values: 111111 and 55555 for the same itemnum 456.
and here is where you have a problem: which of the 2 values to choose, and why?

 

by: pcelbaPosted on 2009-04-22 at 12:52:11ID: 24208854

Did you try this test?

select ITEMNUM, COUNT(GLACCOUNT) as glcnt
 from inventory b
where GLACCOUNT is not null
GROUP BY ITEMNUM
HAVING COUNT(GLACCOUNT) > 1

 

by: ewgf2002Posted on 2009-04-22 at 12:57:26ID: 24208917

angellll,

i fall under the case two scenario.  There are the same item numbers but with different glaccounts.

Example:

Inventory table:
itemnum                 glaccount         location
123                        44444                KY
456                        55555                NC
456                        11111                KY
789                        777777              CA

Current Invost table:
itemnum                 glaccount         location
123                                                  KY
456                                                  NC
456                                                  KY
789                                                  CA
                   

Invcost table needs to be updated with the following from the Inventory table:
itemnum                 glaccount         location
123                        44444                KY
456                        55555                NC
456                        11111                KY
789                        777777              CA

 

by: angelIIIPosted on 2009-04-22 at 13:00:38ID: 24208962

so, you need an additional condition, using location field!!!

update invcost a
set a.glaccount = (select b.GLACCOUNT from nventory b
                 where a.ITEMNUM = b.ITEMNUM
                 and a.location = b.location
                 and b.GLACCOUNT is not null
                 and rownum = 1)
where exists
                 (select 1 from inventory b
                 where a.ITEMNUM = b.ITEMNUM
                 and a.location = b.location
                 and b.GLACCOUNT is not null )
and a.glaccount is null

                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:

Select allOpen in new window

 

by: pcelbaPosted on 2009-04-22 at 13:03:30ID: 24208986

I would remove the rownum condition. If it fails again we will know data are still ambiguous for update.

 

by: ewgf2002Posted on 2009-04-22 at 13:18:13ID: 24209141

pcelba:
I removed the rownum = 1 and the error reappeared.  With the rownum = 1 I am not updating all the records that need to be updated.


update maximo.invcost a
set a.glaccount = (select b.GLACCOUNT from maximo.inventory b
                 where a.ITEMNUM = b.ITEMNUM
                 and a.siteid = b.siteid
                 and b.GLACCOUNT is not null
                 and a.glaccount is null)
where exists
                 (select 1 from maximo.inventory b
                 where a.ITEMNUM = b.ITEMNUM
                 and a.siteid = b.siteid
                 and b.GLACCOUNT is not null
                 and a.glaccount is null )
and a.glaccount is null

 

by: angelIIIPosted on 2009-04-22 at 13:22:04ID: 24209182

>I removed the rownum = 1 and the error reappeared
means, you still have the same issue, that you need more conditions...
so, please use the same method I indicated: if you have 1 value for itemnum and location, could there be multiple rows/different values for glaccount. what additional column is there to be added to the join

 

by: pcelbaPosted on 2009-04-22 at 13:27:45ID: 24209232

It means there is some additional dependency in your tables or rules for GL account assignment are still unknown for us.

What returns this select:

select ITEMNUM, siteid, COUNT(GLACCOUNT) as glcnt
 from inventory b
where GLACCOUNT is not null
GROUP BY ITEMNUM, siteid
HAVING COUNT(GLACCOUNT) > 1

 

by: ewgf2002Posted on 2009-04-22 at 13:38:29ID: 31573439

Thank you angellll !
I found the other condition that I missed.  Works perfectly.

20120131-EE-VQP-002

3 Ways to Join

30-Day Free Trial

The Experts

98% positive feedback on 31,087 answers since March 2000. angeliii is a Microsoft Most Valuable Professional for his work with MS SQL Server & Develoment.

He has also proven his knowledge of Visual Basic Programming, PHP Scripting and Oracle Databases.

The Experts

97% positive feedback on 10,752 answers since July 2000. lrmoore has more than 18 years experience in the networking industry.

The six-time Mircosoft MVPs specialties include firewalls, virtual private networking, and network management.

Testimonials

"...and excellent source for support... Kind of like having your very own IT dept." Electriciansnet

Testimonials

"I was apprehensive at signing up at first. However... it has already made my life as an IT administrator much easier." JaCrews

Testimonials

"WOW! You guys have great, active, and knowledgeable people on here." moore50

Business Clients

Business Clients

In the Press

"If you’ve got a question... Experts Exchange can supply an answer.”

In the Press

"...an invaluable aid for both IT professionals and those who require tech support."

In the Press

"where IT professionals provide quick answers on just about any topic"

Business Account Plans

Loading Advertisement...