2013-04-09 2 views
3

단일 기본 키 필드 (KeyID)와 외부 키 필드 (ForeignID)가있는 테이블 (예 : Example)을 상상해보십시오. 이 외부 키는 테이블의 행을 별도의 테이블에있는 외부 행/항목에 연결하여 다 대일 관계를 설정하는 데 사용됩니다. 그러나 많은 행에 대해 이러한 관계가 존재하지 않으므로이 외부 키 필드는이 행에 NULL입니다.NULL = NULL을 true로 설정하려면 SQL에서 수행 할 작업은 무엇입니까?

이제 하나의 KeyID (예 : 123)가 주어진 경우 모두 개의 일치하는 ForeignID 값을 가진 결과 집합을 가져 오는 데 필요한 기본 SQL은 무엇입니까?

나는 순진하게도 다음과 같은 SQL 시작 : 우리의 일치 키 행이 ForeignID에서 정상적인 값을 가질 때

SELECT E1.* 
FROM Example E1 
JOIN Example E2 
    ON E2.KeyID = 123 
    AND E2.ForeignID = E1.ForeignID 

이건 그냥 잘 작동합니다. 그러나 ForeignID가 NULL 일 경우 실패 (아무 것도 반환하지 않음)합니다. 몇 가지 초기 검색을 수행 한 후, 이제 왜 (this one과 같은 질문을 읽은 후) 이해하지만이 제한을 해결하는 방법에 대한 멋진 해결책을 찾지 못했습니다.

허용 된 SQL Server에는 변경할 수있는 설정이 ANSI_NULLS이지만 더티하고 잠재적으로 문제가되는 해킹처럼 보입니다.

또는 항상 0과 같은 자체 null 값을 구성하고 NULL 대신 ForeignID 열에 고정 할 수는 있지만이 열에 대해 설정 한 외래 키 제약 조건이 깨질 수 있습니다.

그래서 내가 원하는 것을 어떻게 성취 할 수 있을까요?

답변

8

테스트되지 않은,하지만 난 당신이 할 수있는 생각하는 것 :

SELECT E1.* 
FROM Example E1 
JOIN Example E2 
    ON E2.KeyID = 123 
    AND (E2.ForeignID = E1.ForeignID 
    OR (E2.ForeignID IS NULL AND E1.ForeignID IS NULL)) 

편집 : 작품을, SQL 바이올린 here

+2

당신이하고있는 일을 OP와 SQL 서버 – Blorgbeard

+0

Duh에게 더욱 분명하게 보여줍니다. 대답은 간단하고 쉽고 명백합니다. 그래서 당연히 생각하지 않았습니다. -_- – Jeremy

+0

이로 인해 E2의 NULL 행과 E1의 NULL 행에 대한 데카르트 조인이 발생합니다. 테이블 중 하나에 NULL이있는 단 하나의 행이있는 한, 당신은 잘되어야합니다. –

7

You can also do

SELECT E1.* 
FROM Example E1 
     JOIN Example E2 
     ON E2.KeyID = 123 
      AND EXISTS (SELECT E2.ForeignID 
         INTERSECT 
         SELECT E1.ForeignID) 
당신은 아마 거기에 약간의 괄호를 넣어해야
+0

내가 사용하고있는 데이터베이스 중 일부에서 'INTERSECT'를 사용할 수 없지만, 얼마나 유용한지를 깨닫기 시작했습니다. 이 답변을 통해 다음과 같은 유용한 블로그로 연결될 수도 있습니다. [기록되지 않은 쿼리 계획 : 평등 비교] (http://sqlblog.com/blogs/paul_white/archive/2011/06/22/undocumented-query-plans-equality-comparisons. aspx). – Jeremy

관련 문제