Well, I knew that you could do a simple if test on two collections like: If COLL_A = COLL_B THEN ...
and JOIN syntax is like " on thinga = thingb " and I knew how to use the COLLECT function. so you put it all together and voilĂ ! Strange thing is, due to our crappy database design by committee, I needed to do exactly this. Mike On Thu, Jun 25, 2009 at 4:21 PM, Rob Wolfe <rob.wo...@oraclegeeks.com>wrote: > > Where did you every come up with the idea to do that? I like it, but it > wouldn't have occured to me in a million years. > > Rob > > > On Thu, June 25, 2009 19:08, Michael Moore wrote: > > I probably should have just done this in the first place, but here it is > > .. > > -------------------------------------------------------------------- > > > > Performing a JOIN on groups of values using nested > > tables< > http://plsqlnotes.blogspot.com/2008/07/use-sum-function-but-save-detail-from.html > > > > > > -- Join on a nested table example: > > > > -- this example takes 2 tables (c & d). On each table it does > > -- a group by, and the details of that group are collected into a nested > > table. > > -- tables c & d are then joined on that nested table > > > > -- I probably would never do this, but I do think it is interesting. > > > > --DROP TABLE D CASCADE CONSTRAINTS; > > > > CREATE TABLE d (animal VARCHAR2(5 BYTE), grp NUMBER(6)); > > > > SET DEFINE OFF; > > > > INSERT INTO d (animal, grp) VALUES ('cat', 4); > > INSERT INTO d (animal, grp) VALUES ('cat', 7); > > INSERT INTO d (animal, grp) VALUES ('toad', 7); > > INSERT INTO d (animal, grp) VALUES ('frog', 4); > > INSERT INTO d (animal, grp) VALUES ('frog', 7); > > COMMIT ; > > > > -- DROP TABLE c CASCADE CONSTRAINTS; > > > > CREATE TABLE c( animal VARCHAR2(5 BYTE), grp NUMBER(6)); > > > > SET DEFINE OFF; > > INSERT INTO c (animal, grp) VALUES ('cat', 1); > > INSERT INTO c (animal, grp) VALUES ('frog', 1); > > INSERT INTO c (animal, grp) VALUES ('frog', 66); > > INSERT INTO c (animal, grp) VALUES ('cat', 33); > > INSERT INTO c (animal, grp) VALUES ('cat', 44); > > INSERT INTO c (animal, grp) VALUES ('cat', 66); > > INSERT INTO c (animal, grp) VALUES ('frog', 44); > > INSERT INTO c (animal, grp) VALUES ('toad', 44); > > COMMIT ; > > > > SELECT grp, animal FROM c ORDER BY grp, animal; > > SELECT grp, animal FROM d ORDER BY grp, animal; > > > > CREATE OR REPLACE TYPE string20_table IS TABLE OF VARCHAR2(20); > > > > DECLARE > > mystr VARCHAR2(80); > > BEGIN > > FOR cur1 IN > > (SELECT * > > FROM > > (SELECT grp grp1, CAST(COLLECT(animal) AS string20_table) tab1 > > FROM c GROUP BY grp) > > JOIN > > (SELECT grp grp2, CAST(COLLECT(animal) AS string20_table) tab2 > > FROM d GROUP BY grp) > > ON tab1 = tab2 -- the magic happens here > > ) > > LOOP > > DBMS_OUTPUT.put_line( TO_CHAR(cur1.grp1) > > || '=' > > || TO_CHAR(cur1.grp2)); > > END LOOP; > > END; > > -- final output > > -- 1=4 > > -- 44=7 > > -- 66=4 > > > > > > > > > > > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Oracle PL/SQL" group. To post to this group, send email to Oracle-PLSQL@googlegroups.com To unsubscribe from this group, send email to oracle-plsql-unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/Oracle-PLSQL?hl=en -~----------~----~----~----~------~----~------~--~---