2009-05-10 4 views
3

두 개의 열, TeamA 및 TeamB가있는 조인 테이블이있는 경우 어떻게 각 쌍이 고유한지 확인할 수 있습니까?고유 한 열 쌍을 A, B 또는 B, A

명백히이 열에 고유 한 합성 색인을 넣을 수는 있지만 순서 A, B 만 유일하지만 B가 아닌 고유성을 보장합니다.

TeamA | TeamB 
------------- 
red | blue 
pink | blue 
blue | red 

빨간색과 파란색은 이미 첫 번째 레코드로 지정된 다음 마지막으로 다시 지정됩니다. 이미 서로 대면 할 것이므로 불법이어야합니다.

편집 : 또한 SELECT 사례도 처리 할 수 ​​있습니까? 아니면 업데이트? 지우다? 기타 ...

또한 여기에서 중요한 홈 또는 어웨이 팀의 아이디어가 제기되었습니다. 이 초기 개념은 DB 측에서 브라케팅 시스템을 구축하는 방법에 대해 생각하면서 나에게 다가왔다.

답변

2

RDBMS (지정하지 않은 경우)가 트리거를 지원하는 경우 해당 테이블에 트리거를 작성하여 제한 조건을 시행하십시오.

INSERT에서 트리거되는 트리거를 만들어 쌍이 이미 순서가 역전되어 있는지 확인합니다. 롤백을 수행하는 경우 삽입을 허용합니다.

+0

좀 더 구체적으로 알려주시겠습니까? 나는 방아쇠가 무엇인지는 알지만 결코 사용한 적이 없다. –

3

예를 들어 A 열의 값이 B 열의 값보다 (알파벳순 또는 숫자로) 작아야하므로 제약 조건을 정의하십시오. 따라서 {blue, red}를 삽입 할 수는 있지만 삽입 할 수는 없습니다. {빨간색, 파란색} 파란색이 빨간색보다 적기 때문입니다.

+0

{red, red} 또는 {blue, blue}를 사용할 수없는 경우도 캡처합니다. – Apocalisp

+0

하지만 {yellow, blue}는 어떻게 허용합니까? TeamA가 노란색이면 어떻게됩니까? –

+2

이것은 본질적으로 응용 프로그램이이 시나리오를 처리하게 할 것입니다. 더 좋은 방법이 있습니까? –

1

다음은 Mitch가 설명한 트리거 메소드와 함께 사용하기위한 샘플 코드입니다.

이 코드를 테스트하지 않았으며, 그것은 중 하나 순서 있는지 찾고 이것이하고있다

CREATE TRIGGER trig_addTeam 
ON Teams 
FOR INSERT, UPDATE 
AS 

DECLARE @TeamA VARCHAR(100) 
DECLARE @TeamB VARCHAR(100) 
DECLARE @Count INT 

SELECT @TeamA = (SELECT TeamA FROM Inserted) 
SELECT @TeamB = (SELECT TeamB FROM Inserted) 

SELECT @Count = (SELECT COUNT(*) FROM TEAMS WHERE (TeamA = @TeamA AND TeamB = @TeamB) 
       OR (TeamA = @TeamB AND TeamB = @TeamA)) 

IF @Count > 0 THEN 

BEGIN 
    ROLLBACK TRANSACTION 
END 

:-) 여기에 밤 늦게 | B 또는 B가 | A는 현재에 존재 표. 그런 다음 반환 된 개수가 0보다 크고 트랜잭션이 롤백되고 데이터베이스에 커밋되지 않습니다.

0

동일한 쌍 (역전)이있는 경우 TeamA> TeamB를 선택하십시오.

SELECT DISTINCT TeamA, TeamB 
FROM table t1 
WHERE t1.TeamA > t1.TeamB 
    OR NOT EXISTS (
     SELECT * FROM table t2 
      WHERE t2.TeamA = t1.TeamB AND t2.TeamB = t1.TeamA 
    ) 
관련 문제