2013-11-22 1 views
1

나는 SQL Server 2008을 실행하고 난 다음 SQL 쿼리를 실행하기 위해 노력하고있어 장소 :SQL 서버 : LEFT OUTER 조인 여러으로 쿼리 및 조건은

쿼리 1 : 이미 알고

SELECT * 
FROM tableA 
LEFT OUTER JOIN tableB AS tabX ON tabX.some_id = tableA.some_id 
LEFT OUTER JOIN tableB AS tabY ON tabY.some_id = tableA.some_id 
WHERE tabX.some_attribute = 'X' 
AND tabY.some_attribute = 'Y' 

WHERE 진술 후 그 조건은 LEFT OUTER JOIN을 엉망으로 만들고 일반적으로 클래식 INNER JOIN처럼 행동하게 만듭니다.

SELECT * 
FROM tableA 
LEFT OUTER JOIN tableB AS tabX ON tabX.some_id = tableA.some_id AND tabX.some_attribute = 'X' 
LEFT OUTER JOIN tableB AS tabY ON tabY.some_id = tableA.some_id AND tabY.some_attribute = 'Y' 

기본적으로 내가 ON 문 내 WHERE 조건을 포함해야한다 : 2

검색어 : 무엇 SQL Server의 경우는 2005 년

내가이 작업을 수행 할 수 있습니다를 해결하려면, 흥미없는 것입니다 쿼리가 의도 한대로 실행됩니다.

내 첫 번째 질문은입니다. SQL Server는 두 가지 쿼리를 같은 방식으로 해석하지 않습니다 (예전 SQL Server 버전 또는 Oracle DBServer처럼)?

첫 번째 쿼리의 조건 (WHERE 문 이후)이 ("주요 결과"를 의미하는) 주요 논리적 인 레퍼토리에 어떻게 영향을 미치는지에 대해 혼란스러워서 묻습니다. 특히 두 조건 모두 별칭 tabX 및 tabY를 참조하므로

두 번째 질문은 어떻게 든이 동작을 변경할 수 있습니까? (예를 들어, 서버 구성에서?)

안부,

표트르

답변

2

첫 번째 질문 : 당신은 ANSI의 NULLS 어떤 종류의 당신의 2005 DB에 문제를 혼동 스위치가 없다면 어떤 DB 엔진이 쿼리를 동일하게 해석하지 않을 것이다. 그것들은 다르며, 외부 조인 된 테이블의 열에 대한 식은 ON 절 외부에서 의미가 없습니다 (이해하는지 또는 동의하지 않음). 혼란은 SQL Server가 아니라 사용자에게 있습니다. 당신이 질문하는 것은 예상대로입니다.

둘째로 : 나는 희망하지 않는다! 귀하의 질문을 수정하십시오!

+0

그 점을 지적 해 주셔서 감사합니다. 그 경우 (ANSI NULLS)인지 확인해 보겠습니다. 분명히하기 위해서 : 나는이 논리를 훼손하지 않는다. 나는 이것을 이해하고 싶다. 그리고 ANSI NULLS가 MSSQL 2005에 영향을 미칠 수 있다고 말했듯이 - 오라클 서버는 무엇보다 그것도 시도해 보았습니다. – PiWo

+0

"외부 조인 된 테이블의 열에있는 표현식이 다르고 ON 절 외부에서 의미가 없습니다."정확히 내가 무엇을했는지. 고마워, 내 문제 쿼리가 방금 해결되었습니다. – Dragick

1

where 문에 조건을 넣으면 해당 조건과 일치하는 행만 반환되므로이 경우 외부 조인을 사용하면 무의미 할 수 있습니다. 즉 ANSI의 NULL과 관련하여 2012 년

, 설계하고, SQL2005, 2008 년 같은 방식으로 작동 : In SQL Server, what does "SET ANSI_NULLS ON" mean?

+0

나는 어디에서 어떻게 작동하는지 완전히 이해한다. 아마도 내 별칭이 ON 절 예외에 연결되어 있다는 사실에서 혼란 스러울 것이다. 지금은 나에게 명백한 시작이다. 그래도 내 질문에 답할 시간을내어 주셔서 감사합니다 !! – PiWo

1
SELECT * 
FROM tableA 
LEFT OUTER JOIN (SELECT * FROM tableB WHERE some_attribute = 'X') AS tabX ON tabX.some_id = tableA.some_id 
AND 
LEFT OUTER JOIN (SELECT * FROM tableB WHERE some_attribute = 'Y') AS tabY ON tabY.some_id = tableA.some_id 

WHERE 절에서 조건을 복용 시도하고 가입 테이블에 그들을 포함 . 이렇게하면 조건이 OUTER JOIN보다 먼저 적용되므로 결과 행의 올바른 필터가 허용됩니다.