Help Required in Query

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • sumanroyc
    New Member
    • Sep 2006
    • 5

    Help Required in Query

    Hi All,

    We have a requirement to find out the relationships among tables in a particular schema and to arrange the table names from parent table to child table. That is the table (say A) which is referring to no other table should come first and the table (say B) which refers table A should come after A.

    Please let me know how this ordered list of tables can be obtained from the oracle data dictionary. We have to do this using a SQl query.

    Thanks and Regards,
    Suman
  • pragatiswain
    Recognized Expert New Member
    • Nov 2006
    • 96

    #2
    Hi Suman,
    I don't have a Oracle DB right now. So, I have not tested the following. Still I have commented all the queries for better understanding and hope this will help you.

    USER_CONSTRAINT S view contains CONSTRAINT_TYPE (R -> Foreign key, P->Primary Key)
    If CONSTRAINT_TYPE = 'R',R_CONSTRAIN T_NAME contains the corresponding Primary Key Name

    -- GIVES THE RESULT 'TABLES ONLY WITH PRIMARY KEYS'
    SELECT TABLE_NAME, 'P' KEY_FLAG FROM
    (SELECT TABLE_NAME,
    FROM USER_CONSTRAINT S
    WHERE CONSTRAINT_NAME IN (
    SELECT R_CONSTRAINT_NA ME PK_KEY
    FROM USER_CONSTRAINT S
    WHERE CONSTRAINT_TYPE = 'R')
    MINUS
    SELECT TABLE_NAME
    FROM USER_CONSTRAINT S
    WHERE CONSTRAINT_TYPE = 'R')
    UNION ALL
    -- GIVES THE RESULT 'TABLES WITH PRIMARY KEYS AND FOREIGN KEYS'
    SELECT TABLE_NAME, 'B' KEY_FLAG FROM
    (SELECT TABLE_NAME
    FROM USER_CONSTRAINT S
    WHERE CONSTRAINT_NAME IN (
    SELECT R_CONSTRAINT_NA ME PK_KEY
    FROM USER_CONSTRAINT S
    WHERE CONSTRAINT_TYPE = 'R')
    INTERSECT
    SELECT DISTINCT TABLE_NAME
    FROM USER_CONSTRAINT S
    WHERE CONSTRAINT_TYPE = 'R')
    UNION ALL
    -- GIVES THE RESULT 'OTHER TABLES'
    -- SELECT ALL TABLES FROM USER_TABLES MINUS ABOVE CASES
    SELECT TABLE_NAME, 'O' KEY_FLAG FROM
    (
    SELECT TABLE_NAME FROM USER_TABLES
    MINUS
    (
    SELECT TABLE_NAME FROM
    (SELECT TABLE_NAME,
    FROM USER_CONSTRAINT S
    WHERE CONSTRAINT_NAME IN (
    SELECT R_CONSTRAINT_NA ME PK_KEY
    FROM USER_CONSTRAINT S
    WHERE CONSTRAINT_TYPE = 'R')
    MINUS
    SELECT TABLE_NAME
    FROM USER_CONSTRAINT S
    WHERE CONSTRAINT_TYPE = 'R')
    UNION ALL
    SELECT TABLE_NAME FROM
    (SELECT TABLE_NAME
    FROM USER_CONSTRAINT S
    WHERE CONSTRAINT_NAME IN (
    SELECT R_CONSTRAINT_NA ME PK_KEY
    FROM USER_CONSTRAINT S
    WHERE CONSTRAINT_TYPE = 'R')
    INTERSECTION
    SELECT DISTINCT TABLE_NAME
    FROM USER_CONSTRAINT S
    WHERE CONSTRAINT_TYPE = 'R')
    )
    )

    Anyone having better ideas, please post.

    Comment

    • suvam
      New Member
      • Nov 2006
      • 31

      #3
      u may try with a Query using the Connect by---Prior with clause .

      Comment

      Working...