2017-11-09 11 views
0

SQL Serverでは、複数の列を持つ主キーを持つテーブルがあります。このクエリを使用して、テーブル内の主キーの列を取得します。SQL Serverでプライマリキーのメンバー列を取得するにはどうすればよいですか?

SELECT * 
FROM 
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS Tab, 
    INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE Col 
WHERE 
    Col.Constraint_Name = Tab.Constraint_Name 
    AND Col.Table_Name = Tab.Table_Name 
    AND Constraint_Type = 'PRIMARY KEY' 
    AND Col.Table_Name = 'Code Field Information' 

このクエリは、3つの列、主キーのメンバーを返します。しかし、私は、テーブル 'コードフィールド情報'で、注文句なしのクエリを実行すると、結果のソートは、上記のクエリを取得すると同じではありません。ソート優先度の順にプライマリキーの列を取得することは可能ですか?

+2

今日のヒント:現代的で明示的な 'JOIN'構文に切り替えます。 (エラーなしで)書きやすく、読みやすく(維持しやすい)、必要に応じて外部結合に変換する方が簡単です。 – jarlh

+0

_Columns_、フィールドではありません。 – jarlh

+0

あなたは 'ORDER BY'をしたいですか?その場合は、昇順で並べ替えるには 'ORDER BY ASC 'を、降順でソートするには' DESC'を入れます。 – Zorkolot

答えて

0

この方法では、主キーのメンバーを優先順位に従って並べ替えた結果が返されます。

SELECT i.name AS IndexName, OBJECT_NAME(ic.OBJECT_ID) AS TableName, COL_NAME(ic.OBJECT_ID,ic.column_id) AS ColumnName 
    FROM sys.indexes AS i 
    INNER JOIN sys.index_columns AS ic 
    ON i.OBJECT_ID = ic.OBJECT_ID AND i.index_id = ic.index_id 
    WHERE i.is_primary_key = 1 AND OBJECT_NAME(ic.OBJECT_ID) = 'Code Field Information' 
0

あなたは結果が毎回同じになることを保証するために結果を注文する必要があります。私はあなたの例から私が主キーと仮定しているユニークなConstraint_Typeと呼ばれる列があることがわかります。ユニークな値(および時間の経過とともにあまり変化しない値)は、適切な候補です。

これが当てはまる場合は、その列を使用して結果を並べ替えます。

だからあなたのクエリは、(それが最良のクエリ構文ではありませんが、それはあなたに最も近いです)

SELECT * 
FROM 
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS Tab, 
    INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE Col 
WHERE 
    Col.Constraint_Name = Tab.Constraint_Name 
    AND Col.Table_Name = Tab.Table_Name 
    AND Constraint_Type = 'PRIMARY KEY' 
    AND Col.Table_Name = 'Code Field Information' 
ORDER BY Constraint_Type 

ます。また、逆の順序のためORDER BY Constraint_Type DESCを使用することができようになるはずです。クエリの回数に関係なく、結果は同じになります。あなたのデータが変更されていない場合、それはです。

これを頻繁に使用する予定で、すばやく必要な場合は、その列のそのテーブルにインデックスを追加することを検討する必要があります。

関連する問題