2012-08-24 5 views
2

누구나 설명해주십시오. 조건에 따라 조인을 사용할 수 있습니까? 내가 조건을 기반으로 데이터를 필터링한다고 가정 해 봅시다. 이제는 특정 BIT 유형 매개 변수 값이 1이고 데이터 세트가 하나 더 포함되면 조인은 이전과 동일하게 반환됩니다. 여기가, B, C 가 지금은 @bool 비트 파라미터를 미리조건을 기반으로 조인 사용

if @bool=0 
then 
select A.* from A 
inner join B on B.id=A.id 
and if @bool=1 
then 
select A.* from A 
INNER JOIN B on B.id=A.id 
inner join C on C.id=A.id 

감사를 갖는 PROC을 할 세 개의 테이블이다.

+0

* 및 * 대신에 *를 사용합니까? – StuartLC

+0

예, 그렇습니다. –

답변

1

사소한 수정 기능이있는 사용자는 (어쨌든 MS SQL Server의 SPROC에서) 확실히 작동합니다.

if @bool=0 then 
    select A.* from A 
    inner join B on B.id=A.id 
else if @bool=1 then -- Or just else if @boll is limited to [0,1] 
    select A.* from A 
    INNER JOIN B on B.id=A.id 
    inner join C on C.id=A.id 

그러나,주의해야 할 점은 SQL 매개 변수가 반드시 코드를 통해 다른 경로에 대한 최적되지 않습니다이 아래로가는 첫 번째 경로에 대한 계획을 캐시합니다 스니핑이다.

procs에 대해 '여러 대체 쿼리'접근법을 사용하는 경우 일반적으로 반환되는 열 이름과 유형이 모든 경우에 동일하다는 것을 확인하는 것이 좋습니다 (A . *). 당신이 등 필터를 추가해야이 게시물을 살펴있는 경우

DECLARE @sql NVARCHAR(MAX) 
SET @sql = N'select A.* from A 
      inner join B on B.id=A.id' 

IF @bool = 1 
    SET @sql = @sql + N' inner join C on C.id=A.id' 

sp_executesql @sql 

: Add WHERE clauses to SQL dynamically/programmatically

+0

나는이 두 조건을 사용하고 싶지 않다. 대신에 두 가지 conditon cann't 우리는 하나의 조건에서 선택 A. 같은 * 이렇게 내부에서 B 조 = Bid ​​= A.id 사건에 대한 B 조 = BOOL = 1 내부 조인 C에서 C 조. 그것의 틀린 방법 그러나 유사한 논리를 원한다. 감사합니다. –

+0

@champ - 동적 SQL 옵션으로 업데이트되었습니다. 이전 게시물에서 SQL Server를 사용했습니다. – StuartLC

+0

안녕하세요 nonb 감사합니다. 나는 동적 SQL이 더 좋은 옵션이라고 생각합니다. Thnx again –

0

당신은 노동 조합을 사용하여 할 : 나는 bool 테이블 A 또는 B에 저장되어 있으리라 믿고있어

SELECT A.* 
FROM A 
    INNER JOIN B on B.id=A.id 
WHERE bool = 0 

UNION ALL 

SELECT A.* 
FROM A 
    INNER JOIN B on B.id=A.id 
    INNER JOIN C on C.id=A.id 
WHERE bool = 1 

.

0
select A.* from A 
inner join B on B.id = A.id 
left outer join C on C.id = A.id and @bool = 1 
where (@bool = 1 and C.id is not null) or @bool = 0 

@bool = 1 왼쪽 외측 말하자면 가입 "활성화", 및 내부가 WHERE 절에서 적용하여 가입으로도 사실상 만들어 버린다. @bool = 0이면 왼쪽 외부 조인은 C에서 아무 것도 반환하지 않고 WHERE 제한을 제거합니다.

0

편집 SQL Server를 사용하고 있다고 가정하면, 대안은 동적 SQL을 사용하는 것입니다

다음 쿼리를 사용해보십시오

SELECT A.* 
FROM A 
INNER JOIN B on B.id=A.id 
INNER JOIN C on C.id=A.id and @bool=1 
관련 문제