sql >> データベース >  >> RDS >> Sqlserver

SQLServerで外部キーを持つすべてのテーブルを返す7つの方法

    この記事では、SQLServerのデータベースに外部キーを持つすべてのテーブルを返す7つの方法を紹介します。

    各テーブルは、外部キーの数に関係なく、1回だけ返されます。これは、すべての外部キーとそのテーブルを返すこととは異なります。これを行う場合は、SQLServerで外部キーを返す11の方法を参照してください。

    ここでのすべての例は同じデータベースをクエリするため、同じ結果を返します。

    オプション1-sys.tablesを使用したOBJECTPROPERTY()

    最初のオプションは、OBJECTPROPERTY()を使用することです sys.tablesにクエリを実行するときに機能します システムビュー。

    この関数は、TableHasForeignKeyを受け入れます 引数。1のいずれかになります。 または0 (またはNULL )。 1の場合 、これは、テーブルに外部キーがあることを意味します。 0の値 これは、外部キーがないことを意味します。したがって、これをWHEREで使用できます TableHasForeignKeyがあるテーブルのみを返す句 1に設定されています 。

    SELECT 
      SCHEMA_NAME(schema_id) AS [Schema], 
      name AS [Table]
    FROM sys.tables
    WHERE OBJECTPROPERTY(object_id, 'TableHasForeignKey') = 1
    ORDER BY [Schema], [Table];
    

    結果:

    +----------+---------+
    | Schema   | Table   |
    |----------+---------|
    | dbo      | Albums  |
    | dbo      | Artists |
    +----------+---------+
    

    オプション2– OBJECTPROPERTY()とINFORMATION_SCHEMA.TABLES

    この例では、OBJECTPROPERTY()を使用しています INFORMATION_SCHEMA.TABLESをクエリするとき システムビュー。

    SELECT 
      TABLE_SCHEMA,
      TABLE_NAME
    FROM INFORMATION_SCHEMA.TABLES
    WHERE OBJECTPROPERTY(OBJECT_ID(CONCAT(TABLE_SCHEMA, '.', TABLE_NAME)),'TableHasForeignKey') = 1 AND
    TABLE_TYPE='BASE TABLE'
    ORDER BY TABLE_SCHEMA, TABLE_NAME;
    

    結果:

    +----------------+--------------+
    | TABLE_SCHEMA   | TABLE_NAME   |
    |----------------+--------------|
    | dbo            | Albums       |
    | dbo            | Artists      |
    +----------------+--------------+
    

    オプション3– sys.objectsを使用したOBJECTPROPERTY()

    OBJECTPROPERTY()を使用するさらに別のオプションがあります 。今回は、sys.objectsをクエリするときに使用します システムビュー。

    SELECT 
      SCHEMA_NAME(schema_id) AS [Schema],
      name AS [Table]
    FROM sys.objects 
    WHERE type = 'U'
    AND OBJECTPROPERTY(OBJECT_ID(CONCAT(SCHEMA_NAME(schema_id), '.', name)), 'TableHasForeignKey') = 1
    ORDER BY [Schema], [Table]
    

    結果:

    +----------+---------+
    | Schema   | Table   |
    |----------+---------|
    | dbo      | Albums  |
    | dbo      | Artists |
    +----------+---------+
    

    オプション4–DISTINCTを使用したINFORMATION_SCHEMA.TABLE_CONSTRAINTS

    INFORMATION_SCHEMA.TABLE_CONSTRAINTSをクエリする例を次に示します。 制約タイプがFOREIGN KEYであるシステムビュー 。この場合、DISTINCTも使用します 複数の外部キーがある場合にテーブルが複数回返されるのを防ぐための句。

    SELECT DISTINCT
      CONSTRAINT_SCHEMA,
      TABLE_NAME 
    FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
    WHERE CONSTRAINT_TYPE = 'FOREIGN KEY';
    

    結果:

    +---------------------+--------------+
    | CONSTRAINT_SCHEMA   | TABLE_NAME   |
    |---------------------+--------------|
    | dbo                 | Albums       |
    | dbo                 | Artists      |
    +---------------------+--------------+
    

    DISTINCTを削除するとどうなりますか 条項:

    SELECT
      CONSTRAINT_SCHEMA,
      TABLE_NAME 
    FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
    WHERE CONSTRAINT_TYPE = 'FOREIGN KEY';
    

    結果:

    +---------------------+--------------+
    | CONSTRAINT_SCHEMA   | TABLE_NAME   |
    |---------------------+--------------|
    | dbo                 | Albums       |
    | dbo                 | Albums       |
    | dbo                 | Artists      |
    +---------------------+--------------+
    

    この場合、Albums テーブルには2つの外部キーがあるため、その1つのテーブルに対して2つの行を取得します。

    オプション5–DISTINCTを使用したsys.foreign_keys

    DISTINCTを使用する別の例を次に示します。 句ですが、今回はsys.foreign_keysにクエリを実行しています システムビュー。

    SELECT DISTINCT
      OBJECT_SCHEMA_NAME(fk.parent_object_id) AS [Schema],
      OBJECT_NAME(fk.parent_object_id) AS [Table]
    FROM sys.foreign_keys AS fk
    ORDER BY [Schema], [Table];
    

    結果:

    +----------+---------+
    | Schema   | Table   |
    |----------+---------|
    | dbo      | Albums  |
    | dbo      | Artists |
    +----------+---------+
    

    そして、ここにはDISTINCTがありません 条項:

    SELECT
      OBJECT_SCHEMA_NAME(fk.parent_object_id) AS [Schema],
      OBJECT_NAME(fk.parent_object_id) AS [Table]
    FROM sys.foreign_keys AS fk
    ORDER BY [Schema], [Table];
    

    結果:

    +----------+---------+
    | Schema   | Table   |
    |----------+---------|
    | dbo      | Albums  |
    | dbo      | Albums  |
    | dbo      | Artists |
    +----------+---------+
    

    オプション6– sys.foreign_keys with GROUP BY

    これは、sys.foreign_keysにクエリを実行するという点で、前の例と似ています。 システムビュー。違いは、DISTINCTを使用するのではなく 句では、GROUP BYを使用します 代わりに句。

    SELECT 
      OBJECT_SCHEMA_NAME(fk.parent_object_id) AS [Schema],
      OBJECT_NAME(fk.parent_object_id) AS [Table]
    FROM sys.foreign_keys AS fk
    GROUP BY 
      OBJECT_SCHEMA_NAME(fk.parent_object_id), 
      OBJECT_NAME(fk.parent_object_id);
    

    結果:

    +----------+---------+
    | Schema   | Table   |
    |----------+---------|
    | dbo      | Albums  |
    | dbo      | Artists |
    +----------+---------+
    

    オプション7– OBJECTPROPERTYEX()

    この例は、以前のいくつかの例を倍増している可能性がありますが、それでも言及する価値があります。

    OBJECTPROPERTY()を使用する前の例のいずれか 関数は、OBJECTPROPERTYEX()を使用するように簡単に書き直すことができます 働き。この関数は基本的にOBJECTPROPERTY()の拡張です 、そしてそれはすべてを行いますOBJECTPROPERTY()

    したがって、このページの最初の例を次のように書き直すことができます。

    SELECT 
      SCHEMA_NAME(schema_id) AS [Schema], 
      name AS [Table]
    FROM sys.tables
    WHERE OBJECTPROPERTYEX(object_id, 'TableHasForeignKey') = 1
    ORDER BY [Schema], [Table];
    

    結果:

    +----------+---------+
    | Schema   | Table   |
    |----------+---------|
    | dbo      | Albums  |
    | dbo      | Artists |
    +----------+---------+
    

    知っておくべき違いの1つは、これら2つの関数が異なる戻り型を返すことです。 OBJECTPROPERTY() intを返します 一方、OBJECTPROPERTYEX() sql_variantを返します タイプ。


    1. 列を削除しても列参照が完全に削除されるわけではありません-postgresql

    2. PostgresのRails配列列に新しいデータが保持されない

    3. MySQLLEFTJOINを使用した行の削除

    4. MONTH()の例– MySQL