Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
![]() |
![]() |
Home -> Community -> Usenet -> c.d.o.misc -> Re: double outer join
scott wrote:
> Guys this wasn't homework, I know JED and he's under the gun to get
> some things done at work so I suggested he post his questions here.
> It would be great if you could give him a hand instead of treating him
> like some college kid.
>
> Thanks
> Scott
>
> Daniel Morgan <damorgan_at_exxesolutions.com> wrote in message news:<3EE8E517.1785C15_at_exxesolutions.com>...
> > Jed wrote:
> >
> > > My dataset looks like this
> > >
> > > CIID RESULT NUM
> > > A PASS 1
> > > A FAIL 2
> > > B PASS 1
> > > C FAIL 2
> > > D PASS 3
> > > D FAIL 3
> > >
> > > I want to query this data and return a dataset that looks like this
> > >
> > > CIID PASS FAIL
> > > A 1 2
> > > B 1 0
> > > C 0 2
> > > D 3 3
> > >
> > > I tried this (table name is xxx):
> > >
> > > select pass.ciid, pass.num, fail.num
> > > from (select ciid,num from xxx where result='PASS') pass,
> > > (select ciid,num from xxx where result='FAIL') fail
> > > where pass.ciid=fail.ciid
> > >
> > > I lose the B and C record
> > >
> > > When I tried this:
> > > select pass.ciid, pass.num, fail.num
> > > from (select ciid,num from xxx where result='PASS') pass,
> > > (select ciid,num from xxx where result='FAIL') fail
> > > where pass.ciid=fail.ciid(+)
> > >
> > > I still lose the C record
> > >
> > > Is there a way to do something like a double outer join
> > > pass.ciid (+) = fail.ciid (+)
> > >
> > > When I try, I get the error ORA-01468: a predicate may reference
> > > only one outer-joined table
> >
> > This is classroom homework so I'll give you a hint rather than the
> > answer.
> >
> > You are on the right track but think about NVL and how you might use it.
And miraculously he needs to know this at a time the corresponds with the end of the semester? Fascinating.
Well since you guys are so interested in the answer rather than an education I will violate my basic principles and give it to you in the hope that you might learn something. Perhaps starting with not posting with language best left on the school yard when graduating from middle-school at age 14.
CREATE TABLE test (
ciid VARCHAR2(1),
result VARCHAR2(4),
num NUMBER(1));
INSERT INTO test VALUES ('A', 'PASS', 1); INSERT INTO test VALUES ('A', 'FAIL', 2); INSERT INTO test VALUES ('B', 'PASS', 1); INSERT INTO test VALUES ('C', 'FAIL', 2); INSERT INTO test VALUES ('D', 'PASS', 3); INSERT INTO test VALUES ('D', 'FAIL', 3);
SELECT ciid, SUM(pass) PASS, SUM(fail) FAIL
FROM (
SELECT ciid, DECODE(result, 'PASS', NUM, 0) PASS,
DECODE(result, 'FAIL', NUM, 0) FAILFROM test)
The entire time I spent doing this was less than four minutes including creating the table and writing the insert statements. Which says much about you, and your DBA if such a person exists which I doubt.
I would advise any and all potential employers to make a note that these two, if it is even two, are unworthy of employment. And if you were in my class at the University of Washington you would FAIL!
-- Daniel Morgan http://www.outreach.washington.edu/extinfo/certprog/oad/oad_crs.asp damorgan_at_x.washington.edu (replace 'x' with a 'u' to reply)Received on Fri Jun 13 2003 - 10:37:29 CDT
![]() |
![]() |