[comp.databases] Informix Brain Teaser

flak@slovax.UUCP (Dan Flak) (01/12/88)

Here's a brain teaser for you folks using Informix 3.30. (I can't
validate SQL since I don't have it).

The schema looks like:

    database foo

    file family

    field name   type character 20 index primary
    field parent type character 20 index dups.

    end

The data entry is set up (using PERFORM) so that once the first record
is seeded into the database ("ADAM" or "EVE" if you prefer), all other
records validate from the "name" field to accept legal values for the
required "parent" field. Notice that the "index primary" in each field
forces each individual name to be unique.

The challenge:

    Write a progam using ACE and/or C which will accept as its
first argument the name of any ancestor, and produce a list of all
descendants for as many generations as are loaded in the database.

I've run across this problem working with "Task Organizations" with
the U.S. Army, but I could also see an application in genetics, 
railroad management (i.e. trains, and trains of trains), or any other
problem where the whole is equal to the sum of its parts, but those
parts aren't always permanently assigned.

I really would like to see how others have solved this problem.
-- 
                  {hplsla,uw-beaver}!tikal!slovax!flak
Dan Flak-R & D Associates,3625 Perkins Lane SW,Tacoma,Wa 98499,206-581-1322

jfh@killer.UUCP (John Haugh) (01/14/88)

In article <2678@slovax.UUCP>, flak@slovax.UUCP (Dan Flak) writes:
> Here's a brain teaser for you folks using Informix 3.30. (I can't
> validate SQL since I don't have it).
> 
> The schema looks like:
> 
>     database foo
> 
>     file family
> 
>     field name   type character 20 index primary
>     field parent type character 20 index dups.
> 
>     end
[ stuff deleted ]
> The challenge:
> 
>     Write a progam using ACE and/or C which will accept as its
> first argument the name of any ancestor, and produce a list of all
> descendants for as many generations as are loaded in the database.
> --
> Dan Flak-R & D Associates,3625 Perkins Lane SW,Tacoma,Wa 98499,206-581-1322

This is basically impossible in ACE.  You can get N generations using N
read statements.  Watch -

database people end

define param[1] person type character length 20 end

read into children parent, child = name where parent = person end

{ now I have the first generation }

read into grandchildren children, grandchild = name
	joining children.child = optional parent

{ now I have the second }

sort by parent, child, grandchild end

format every record end

To get the third generation you need a third read.  It would look similiar
to the second, except, the new field would be aliased to `greatgrandchild'.
Just remember the 50 character limit on field names ;-).

- John.
-- 
John F. Haugh II                  SNAIL:  HECI Exploration Co. Inc.
UUCP: ...!ihnp4!killer!jfh                11910 Greenville Ave, Suite 600
"Don't Have an Oil Well? ...              Dallas, TX. 75243
 ... Then Buy One!"                       (214) 231-0993 Ext 260