Thread

  1. Feature Suggestion: Select * from myparent+

    Thomas Swan <tswan@olemiss.edu> — 2000-07-27T19:57:06Z

    I've been trying to work on a system of using classes as a variation on 
    normalization of data.
    
    However, I've run into a really frustrating problem.  I had posted this 
    previously but not in this form to the PGSQL SQL list.
    
     From that posting...
    --begin--
    create table foo (id int8);
    create table bar1 (name text) inherits (foo);
    create table bar2 (data text) inherits (foo);
    create table hybrid ( ) inherits (bar1, bar2);
    
    INSERT INTO foo VALUES (1);
    INSERT INTO bar1 VALUES (2,'myname');
    INSERT INTO bar2 VALUES (3,'mydata');
    INSERT INTO hybrid VALUES (4,'morename','moredata');
    
    
    
    I want to do a SELECT * FROM foo*; but I only get the 'id' column as in :
    
    id
    ---
      1
      2
      3
      4
    
    
    
    What would be the query to get the following table or a magical way to 
    expand children?
    
    I had originally hoped that SELECT * FROM foo* would yield the following, 
    but it's not so.
    
    id | name       | data
    ---+------------+-------------
      1 | null       | null
      2 | 'myname'   | null
      3 | null       | 'mydata'
      4 | 'morename' | 'moredata'
    
    --end--
    
    I can get the same result by doing the following query...
    
    SELECT * FROM hybrid UNION \
          (SELECT id,null,data FROM bar2) UNION \
          (SELECT id,name,null FROM bar1) UNION \
          (SELECT id,null,null FROM foo)
    
    What I would like to suggest although it may be too much or a little odd is 
    to have the column listing expanded based on the children.   I have been 
    unable to construct a query or function that would run through based on the 
    class/table name and return this.
    
    What if following a class/table by + did this.
    
    For example the above query could be produced by the following statement:
             SELECT * FROM foo+
    
    The pattern I noticed it works best starting from the farthest 
    child(ren).  However, I also observed this could be really awkward 
    depending on the number of columns ancestors had.    And, the table 
    "hybrid" was unique in that it inherited all from a common set 
    of  parents.  It would be different if the farthest branches merged or if a 
    branch contained a different data type in the same column namespace.
    
    I did figure a methodology on solving it:
    
    1. get the relid of the table/class;
    2. using pg_inherits, resolve all dependent children.
    3. create an array of all columns (may be data type conflicts so either 
    resolve or error) {you could avoid conflicts with careful planning on names}
    4. union all tables inserting nulls in non-available columns places.
    
    Note: Step 2 might be easily facilitated if an array of immediate children 
    was available from pg_inherits table not just the parent, but then 
    inserting classes might be expensive. It's a thought...
    
    This has been very frustrating even in trying to get information from the 
    pg_* system tables.   Ideally a user should never have to look at those.
    
    I'm afraid this all sounds like a complaint.  Quite to the contrary, I've 
    been more than pleased with postgresql and what it has to offer and 
    continually look forward to newer releases, new features and improvements.
    
    Thomas
    
    -
    - Thomas Swan
    - Graduate Student  - Computer Science
    - The University of Mississippi
    -
    - "People can be categorized into two fundamental
    - groups, those that divide people into two groups
    - and those that don't."