2011-09-30 21 views
8

私はテーブル、テーブルAがある場合:特定の行の外部キー依存関係を見つける方法は?

Id 
1 
2 
3 
... 

そして、二つの他のテーブル:

テーブルB:

Id, TableAId 
1 1 
2 1 

表C:

Id, TableAId 
1, 1 
2, 2 

TableAIdはFKの関係であります表A.Id。

どのようにしてTableA、Id 1に3行が指し示されていると判断できますか?そしてそのTableA、Id 2には1つの行があります。さらに具体的には、これらの行が何であるかを特定するにはどうすればよいですか? (彼らの表の名前とID)

+0

あなたの目標は、完全には明らかではありません。テーブル間の外部キーrealtionを識別するためのメタデータを探したいか、または外部キーの関係を既に知っていることを前提としてTSqlクエリでデータを検索する必要がありますか? – user957902

+0

私はメタデータに興味がありません。私の例では、別の特定の行に依存するテーブルと特定の行をどのように決定するかを示します。私はターゲットテーブルと一緒にすべての可能なテーブルを結合する(潜在的に)巨大なselectステートメントを書くことなく、その情報を取得したいと思います。 –

答えて

15

INFORMATION_SCHEMAビューを使用して問題の行を表示するselect文を生成できます。私は質問で提供されたテーブルに対してこれをテストしただけですが、キーが複数の列である場合に機能するように拡張できます。

declare @table_schema nvarchar(50) = 'dbo', 
     @table_name nvarchar(50) = 'TableA', 
     @id int = 1 

select fk_col.TABLE_SCHEMA, fk_col.TABLE_NAME, fk_col.COLUMN_NAME, 
    'select * from ' + fk_col.TABLE_SCHEMA + '.' + fk_col.TABLE_NAME + ' t1 ' 
     + ' inner join ' + @table_schema + '.' + @table_name + ' t2 ' 
     + ' on t1.' + fk_col.COLUMN_NAME + ' = t2.' + pk_col.COLUMN_NAME 
     + ' where t2.' + pk_col.COLUMN_NAME + ' = ' + cast(@id as nvarchar) 

from INFORMATION_SCHEMA.TABLE_CONSTRAINTS pk 

    join INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE pk_col 
     on pk.CONSTRAINT_SCHEMA = pk_col.CONSTRAINT_SCHEMA 
     and pk.CONSTRAINT_NAME = pk_col.CONSTRAINT_NAME 

    join INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS fk 
     on pk.CONSTRAINT_SCHEMA = fk.UNIQUE_CONSTRAINT_SCHEMA 
     and pk.CONSTRAINT_NAME = fk.UNIQUE_CONSTRAINT_NAME 

    join INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE fk_col 
     on fk_col.CONSTRAINT_SCHEMA = fk.CONSTRAINT_SCHEMA 
     and fk_col.CONSTRAINT_NAME = fk.CONSTRAINT_NAME 

where pk.TABLE_SCHEMA = @table_schema 
    and pk.TABLE_NAME = @table_name 
    and pk.CONSTRAINT_TYPE = 'PRIMARY KEY' 

生成されたSELECT文:

select * from dbo.TableB t1 inner join dbo.TableA t2 on t1.TableAId = t2.Id where t2.Id = 1 
select * from dbo.TableC t1 inner join dbo.TableA t2 on t1.TableAId = t2.Id where t2.Id = 1 

とクエリ結果:

Id   TableAId Id 
----------- ----------- ----------- 
1   1   1 
2   1   1 

Id   TableAId Id 
----------- ----------- ----------- 
1   1   1 
+0

素晴らしい答え、thx :) – mrzepa

+0

こんにちは、私に同等のMysqlコードを教えてください。 –

2

はFKの関係が存在し、あなたがSQL Serverでsysカタログビューを検査するために必要なものを見つけるために - のようなもの:

SELECT * 
FROM sys.foreign_keys 
WHERE referenced_object_id = OBJECT_ID('TableA') 

これは、すべての外部キーを一覧表示されます関係が存在するのはTableAです。

この情報を取得したら、TableAと関連する他のテーブルの間のかなり単純なJOINです。

更新:TableBTableC参照ごTableA、あなたはシンプルでdepdendent行JOINを見つけることができます:

SELECT c.* 
FROM dbo.TableC c 
INNER JOIN dbo.TableA a ON a.ID = c.TableAID -- or whatever column joins the tables..... 
WHERE....... -- possibly with a WHERE clause... 
+0

@KirkWoll:はい、私は知っています - しかし、データレベルのそれらの卑劣は、スキーマに基づいてのみ存在します! **他のテーブル参照 'テーブルA'が何であるかわからない場合、あなたは'テーブルA 'の他のテーブルの行を参照している**行**を見つける方法はありません** –

+0

*スキーマレベルでの依存関係を知る。しかし、それはデータの依存関係を見つける方法を教えてくれません。どのように依存*行*を見つけるのですか?そして実際には、私はこのテーブルを指し示す約20-30のテーブルを持っています。その大規模な結合を作成することは唯一の方法ですか? –

+1

@KirkWoll: 'TableA'の行を参照している行が他のどのテーブルにあるのかわからない場合、どうやってデータの依存関係を見つけたいですか?あなたは**スキーマの依存関係が必要です** **最初の** **その後の**およびそれ以降のデータ依存性を探すことができます.... –

4

私はあなたに正確なコードを与えることができないので、このコンピュータ上のSQLを持っていますが、ここであなたがすべき方法ですしていません行く。 SQL Serverの用語を使用することに注意してください。

少なくともSQL Serverでは、ダイナミックSQLなしでこれを行う方法はありません。

  1. テンポラリテーブル#tを列FK_TBL_NM,FK_CLMN_VALで作成します。
  2. テーブルAのPKのためのすべてのFK関係を得ることは困難ではありません。

    SELECT * FROM sys.foreign_keys 
    WHERE referenced_object_id = OBJECT_ID('TableA') 
    
  3. は、このクエリの結果スルーとそれぞれに反復するためにカーソルを使用して生成し、参加する動的SQLを実行しますTableAとテーブルからカーソルを取り出し、FK_TBL_NM(TableB、TableC、...)とfkカラムの値を返します。

  4. ば#tに結果を挿入します今

(テーブルに動的SQL結果を得るが、stackoverflowの研究を行うためにトリッキーです)お持ちTableBの行ごとに1行を含むテーブル、TableC、...

私は、わずか数日前の仕事で私の現在のプロジェクトのための類似のロジックを持つコードを書いたので、これは実現可能であることが分かりました。

おそらく、あなたのコードはpk/fkで複数の列を使用するようにしてください。また、列にはさまざまなデータ型があります。それは少し複雑ですが、可能です。

上記のすべての手順を実装することは難しくありません。しかし、何か問題がある場合は、stackoverflowで検索してください:

関連する問題