2011-02-09 37 views
2

私は私に次のような出力与えるSybaseのクエリ設定しようとしています:つまり特定のSybaseテーブル、フィールド、キー、制約

Table  KeyType  KeyNumber  Column 
table1 PK   1    table1_id 
table1 FK   2    table2_id  
table1 FK   3    table3_id 
table1 FK   4    table4_id 
table1 Unique  5    table1_abc 
table1 Unique  5    table1_def 

は、私は各テーブルにPKを必要とし、それが持っているすべての外部キー、すべてのユニークキー(キーが上記のユニークキーのような複数の要素を持つ場所ではなく、これは同じKeyNumberを持つことによって識別されます)。

私はsysobject、syscolumns、syskeys、およびsysconstraintsを使用する必要があると推測していますが、どのように相互リンクするのか分からないようです。

おかげ
カール

答えて

3

これがスタートです:

SELECT 
    t.name, 
    CASE k.type 
     WHEN 1 THEN 'PK' 
     WHEN 2 THEN 'FK' 
     WHEN 3 THEN 'Common' 
    END, 
    c.name 
FROM 
    sysobjects t INNER JOIN 
    syscolumns c ON c.id = t.id INNER JOIN 
    syskeys k ON k.id = t.id AND c.colid IN (k.key1, k.key2, k.key3, k.key4, k.key5, k.key6, k.key7, k.key8) 
WHERE 
    t.type = 'U' AND k.type in (1,2) 

それは、キーIDが含まれていない、そのために私はあなたが何とかするnull以外のテーブルのIDとkeyN列をハッシュことができると思いますキーの一意のIDを生成します。

また、一意のインデックスは含まれません。そのために、あなたはの線に沿って何かをUNIONしたい:

SELECT 
    t.name, 
    'Unique', 
    c.name 
FROM 
    sysobjects t INNER JOIN 
    syscolumns c ON c.id = t.id INNER JOIN 
    sysindexes i ON i.id = t.id 
WHERE t.type = 'U' 

それをフィルタリングする方法についてSybase manual page for sysindexesをチェックしてください。

+0

この最初のクエリは私にとってはうまくいかないようです。私は 'syskeys'テーブルから関連するキーを取得しません。 [この質問](http://stackoverflow.com/questions/7299550/discover-primary-unique-keys-in-sybase-ase)も参照してください。私が見なければならないものはありますか? –

+0

@ LukasEder 'syskeys'テーブル –

+0

@aFに行を追加するには、' sp_primarykey'と 'sp_foreignkey'を使う必要があります。ヒントをありがとう。私のユースケースに 'sysreferences'と' object_name() '、' index_name() '、' col_name() '関数を使用して終了しました –