2009-07-07 2 views
2

나는 데이터베이스 처리에 꽤 신선하지만 지금은 전혀 경험이 없다. 그러나, 나는 문제에 붙어있다. 호환 인 모든 기사를 임의의 크기의 다른 기사 집합에 반환하는 SQL 쿼리를 공식화해야합니다. 쿼리는 발견 된 기사가 사용할 수 있어야하는 (호환 가능한) 기사 목록을 사용자가 입력 할 수있는 기사를 검색하기 위해 응용 프로그램의 스크립트에 의해 생성됩니다. "... 나에게 B와 호환되는 모든 기사를주고 및 N"
: 문서 번호 A의 목록은 그래서 SQL 데이터베이스의 Article compatibilty

, B는, ..., N은, 질문은

질문은 하나의 테이블에만 해당됩니다.
호환
아트 원
artTwo는

호환 각 레코드는 호환성 관계를 나타내는 매우 다른에서 하나 개의 컬럼에 문서 번호 A의 레코드와 B가 IFF에 문서 A와 B가 호환되는지 . NB 주문서는 호환성을 위해 아무런 차이가 없습니다.

이제 기사 목록이 주어지면 호환 가능한 모든 기사를 반환하는 쿼리를 생성 할 수 있기를 원합니다. 내가 [1], 쿼리가 반환과 호환되는 모든 기사를 원한다면 예를 들어

 
A B 
---- 
1 2 
3 1 
3 4 


지원 테이블을 고려 [2, 3].
목록 [2, 3]에 의해 생성 된 쿼리는 [1]을 반환합니다.
목록 [1, 3]에서 생성 된 쿼리는 빈 목록을 생성합니다.

분명히이 방법이 문제를 해결하는 가장 좋은 방법이 아니므로 더 나은 솔루션을 환영합니다. 나는 이런 종류의 질문이 어떤 유형의 서브 쿼리를 필요로한다고 생각하는데, 나는 아직 마스터하지 못한 주제이다.

그래서 내 질문입니다 -이 특정 문제가 쉽게 해결할 수 있도록 데이터베이스를 모델링 할 수있는 방법이 있습니까, 아니면 어떤 경우에 누군가가 쿼리를 공식화하는 데 도움이 될 수 있으며 다양한 양 입력의. 주제에 대한 읽기에 대한 조언도 매우 환영합니다.

많은 감사

마르코

+1

테이블 구조와 어떤 결과 당신이 세부 – KuldipMCA

+0

좋아, 감사에 설명 할을 정의합니다. OP 편집 됨. – Nubsis

답변

1
SELECT id 
FROM (
     SELECT B AS id 
     FROM compat 
     WHERE A IN (list) 
     UNION 
     SELECT A 
     FROM compat 
     WHERE B IN (list) 
     ) q 
GROUP BY 
     id 
HAVING COUNT(*) = @cnt 
가입

, 여기서 @cnt은 목록의 총 항목 수입니다.

이 작업을하려면 호환 쌍이 테이블에 두 개의 항목이 없는지 확인해야합니다 (즉, (1, 2)(2, 1)이 한 번에 잘못 되었음).

이 두 제약이하는 것이 가장 좋습니다 : 이렇게하면

ALTER TABLE compat ADD CONSTRAINT ux_compat_ab UNIQUE (A, B) 
ALTER TABLE compat ADD CONSTRAINT cc_compat_order CHECK (A < B) 

, 당신은 UNION을 대체 할 수있다 : 하나는, 다른 하나는 최소한의 id와 문서는 먼저 것을 확인 한 쌍은 고유 보장 UNION ALL 더 효율적으로 :

SELECT id 
FROM (
     SELECT B AS id 
     FROM compat 
     WHERE A IN (list) 
     UNION ALL 
     SELECT A 
     FROM compat 
     WHERE B IN (list) 
     ) q 
GROUP BY 
     id 
HAVING COUNT(*) = @cnt 
+0

그게 완벽하게 해결되었습니다! 엄청 고마워! ---- 마르코 – Nubsis

0

선택 * 기사에서 내부는 ct.ArticleBID가에 (ID의 목록은 여기) a.Id = ct.ArticleAID 에 compatTbl 코네티컷

관련 문제