2017-09-25 27 views
1

列のテーブルについて、次の情報を取得しようとしています。内部結合と左結合による複製の取得

1)主キー。

2)ISNULLABLE

3)Is_Identity。

問合せ:

SELECT c.name 'Column Name',c.is_nullable,c.is_identity,ISNULL(i.is_primary_key, 0) 'Primary Key' FROM sys.columns c INNER JOIN sys.types t ON c.user_type_id = t.user_type_id LEFT OUTER JOIN sys.index_columns ic ON ic.object_id = c.object_id AND ic.column_id = c.column_id LEFT OUTER JOIN sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id WHERE c.object_id = OBJECT_ID('[HumanResources].[Employee]') 

私はAdventure Worksデータベースで働いていますが、ここでの問題は、私はOrganizationNode列を2回取得していますし、私はその理由を理解することができませんです。

他のテーブルについては、この問題は発生していませんが、テーブル[HumanResources].[Employee]についてのみこの問題が発生しています。私もdistinctを試してみましたが、そのためあなたが見ることができるように、それは、列の順序をシャッフル

https://www.dropbox.com/s/nutfat17b73boav/AdvantureWorksSeScript.bak?dl=0

enter image description here

:以下

は、データベースのBAKファイルをダウンロードするためのリンクです2番目の出力。 BirthDate is coming at the top instead of BusinessEntityID.

私は他のすべてのテーブルと正常に動作しているが、私はそれが[HumanResources].[Employee]テーブルの場合には、重複する列を与えているか、私はいくつかのテーブルでそれをテストしていることも理由になっていないです、私の下のクエリとしてdistinctを使用したくないと他のほとんどのデータベースではクエリが正しく動作しないことがあります。

私が言及している3つのもの(pk,inullable etc.)をフェッチするために、すべてのシナリオでクエリが正しいかどうかはわかりません。

+0

を試してみてください。私はあなたのデータベースのコピーをプルダウンしませんでした。私はこの問題が何であるか理解していません。おそらく1つ以上の索引を持っているか、索引に1つ以上の列がありますか? –

+0

したがって、テーブルのすべての列とwhere句をリストし、それらが主キーであり、ヌルであり、同一であるかどうかを表示しますか? – SEarle1986

+0

その列が複数のインデックスで使用されている可能性はありますか?クエリのインデックス名を列として追加します。 – KeithL

答えて

0

はあなたの行の特定の順序を持​​たせたい場合はORDER BY句で...それを行うための1と唯一の1の方法があり、この

SELECT name, 
     is_identity, 
     is_nullable, 
     is_primary_key 
FROM (
      SELECT c.name, 
        c.column_id, 
        c.is_identity, 
        c.is_nullable, 
        ISNULL(i.is_primary_key,0) is_primary_key, 
        ROW_NUMBER() OVER(PARTITION BY c.name ORDER BY c.name) rn 
      FROM sys.columns c 
        JOIN sys.tables t 
         ON t.object_id = c.object_id 
        LEFT JOIN sys.index_columns ic 
         ON c.object_id = ic.object_id AND c.column_id = ic.column_id 
        LEFT JOIN sys.indexes i 
         ON i.object_id = ic.object_id AND i.index_id = ic.index_id 
      WHERE t.name = 'Employee' 
     )keys 
WHERE rn = 1 
ORDER BY column_id 
+0

答えをありがとうが、私は1つのクエリを実行する必要があるように1に2つのクエリをマージできますか? –

+0

は、テンポラリテーブルの代わりにサブクエリを使用するように改訂されました.... – SEarle1986

+0

これは、私のクエリにdistinctキーワードを追加するときのように、私の列の順序を乱してしまいます。私は私のテーブルのように私の列の正確な順序 を取得したい。 –

関連する問題