2011-09-30 4 views
8

나는 테이블, TableA의 경우 :특정 행의 외래 키 종속성을 찾는 방법은 무엇입니까?

Id 
1 
2 
3 
... 

그리고 다른 두 테이블 :

TableB의 :

Id, TableAId 
1 1 
2 1 

TableC :

Id, TableAId 
1, 1 
2, 2 

TableAId는 FK의 관계 TableA.Id.

TableA, Id 1에 3 개의 행이 있는지 어떻게 확인할 수 있습니까? 그리고 그 TableA, Id 2는 하나의 행을 가리키고 있습니까? 더 구체적으로 말하면 행이 무엇인지 어떻게 식별 할 수 있습니까? (자신의 테이블 이름과 ID)

+0

당신의 목표는 완전히 명확하지 않다. 테이블 간의 외래 키 realtion 배송을 식별하기위한 메타 데이터를 찾고 싶습니까? 아니면 외래 키 관계를 이미 알고있는 데이터를 찾기 위해 TSql 쿼리를 원하십니까? – user957902

+0

나는 메타 데이터에 관심이 없다. 필자는 예제에서 다른 특정 행에 대한 종속성이있는 특정 행과 테이블을 결정하는 방법에 대해 설명합니다. 목표 테이블과 함께 가능한 모든 테이블을 조인하는 엄청난 select 문을 작성하지 않고이 정보를 얻고 싶습니다. –

답변

15

뷰를 사용하여 문제의 행을 표시하는 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 * 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과 관련된 다른 테이블 사이의 매우 간단한 조인입니다.

업데이트 :TableBTableC 참조하여 TableA, 당신은 간단한와 depdendent 행 가입 찾을 수 있습니다

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 : 예, 압니다. 그러나 데이터 수준의 그러한 패배는 스키마를 기반으로 만 존재합니다! ** 다른 테이블 참조'TableA'을 모른다면 ** 다른 테이블의 ** 행 **이 'TableA'에서 행을 참조하는 것을 알아낼 방법이 없습니다 ** –

+0

I * do * 스키마 수준에서 종속성을 알아야합니다. 그러나 그것은 데이터 종속성을 찾는 방법을 알려주지 않습니다. 종속 * 행 *을 어떻게 찾을 수 있습니까? 실제로 저는이 테이블을 가리키는 20-30 개의 테이블을 가지고 있습니다. 그 엄청난 조인을 만드는 것이 유일한 방법일까요? –

+1

@KirkWoll :'TableA'에서 여러분의 행을 참조 할 다른 행을 모를 경우 어떻게 데이터 의존성을 찾고 싶습니까 ??? 당신은 ** 스키마 의존성을 필요로합니다 ** 처음 ** ** 그 다음에 만 (그리고 그 이후 만) 데이터 의존성을 찾을 수 있습니다 .... –

4

나는 내가 당신에게 정확한 코드를 제공 할 수없는이 컴퓨터에 SQL을 필요는 없습니다하지만 여기에 방법은 당신이해야이다 가기. 제발, 나는 SQL Server 용어를 사용합니다.

적어도 SQL Server에서는 동적 SQL 없이는이 작업을 수행 할 방법이 없습니다.

  1. FK_TBL_NM, FK_CLMN_VAL 열이있는 임시 테이블 #t를 만듭니다.
  2. TableA의의 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 결과를 얻을 수 있지만 유래에 대한 연구를 할 까다 롭습니다) 당신이 TableB의 각 행에 대해 한 행을 포함하는 테이블 , TableC, ...

필자는 단지 며칠 전 현재의 프로젝트에 대한 비슷한 논리로 코드를 작성했기 때문에 이것이 가능하다는 것을 알고 있습니다.

코드가 pk/fk에서 더 많은 열을 사용하도록해야합니다. 또한 열에 여러 데이터 유형이 있습니다. 그것은 약간 복잡하지만 가능한 일입니다.

위에 나열된 모든 단계는 구현하기 어렵지 않습니다. 그러나 어려움이 있으면 stackoverflow에서 검색하십시오.

관련 문제