2013-08-24 3 views
1

나는이 네 개의 SQL Server 데이터베이스 테이블 :쿼리가 둘 이상의 결과를 반환하는 이유는 무엇입니까?

  1. inventory
  2. inventory2
  3. bdo
  4. details

구조가 그대로 :

재고

AllocationID MSISDN 
1    3018440225 
2    3028431115 

Inventory2

AllocationID MSISDN 
    1    3011234567 
    2    3026440657 
    3    3454159650 

BDO

BDO_ID  BDO_MSISDN 
1   3457076952 
2   3005000475 

세부

(210)

는 이제 다음 쿼리에서 레코드를 얻을 필요가 :

select a.msisdn, b.bdo_id 
from details a, bdo b, inventory c, inventory2 d 
where 
    a.msisdn = 3454159650 
    and (a.allocationid = c.allocationid) or (a.allocationid = d.allocationid) 
    and (c.bdo_id = b.bdo_id) or (d.bdo_id = b.bdo_id) 

이 쿼리는 1 개 이상의 결과 (모두 정확히 같은) 왜 그렇게입니다 반환 ??? 내가 틀렸다면 제 개념과 질문을 수정하십시오.

+1

LIMIT 1을 추가하십시오. – Rahul

+0

where 절에 괄호를 추가해야합니다. 나는 현재 상황이 당신이 기대하는 바가된다고 생각하지 않는다. 조인을 사용하지 않는 이유는 무엇입니까? –

+0

@PatrickKostjens 그가 외부 조인 대신에 그렇게하는 것처럼 보입니다. 그러나 실제로 알기는 어렵습니다. – alroc

답변

1

나는 무엇이든 반환한다는 것에 놀랐습니다. 존재하지 않는 bdo_id 필드를 참조하고 있습니다.

귀하의 주요 문제는이 대신

select a.msisdn,b.bdo_id 
from details a,bdo b,inventory c,inventory2 d 
where 
a.msisdn=3454159650 
and ((a.allocationid = c.allocationid) or (a.allocationid = d.allocationid)) 
and ((c.bdo_id=b.bdo_id) or (d.bdo_id=b.bdo_id)) 
+0

여전히 동일한 결과 ... :( –

2

당신은 쿼리에 대한 매우 이상한 형태를 시도 and

or 동안의 우선 순위입니다. 먼저 join 구문을 사용해야합니다. 더 효율적으로해야 쿼리로 명시 적으로 구조화

select d.msisdn, b.bdo_id 
from (select i.* 
     from (select i.* from inventory i union all 
      select i2.* from inventory i2 
      ) i 
    ) i join 
    details d 
    on d.allocationid = i.allocationid join 
    bdo b 
    on i.bdo_id=b.bdo_id 
where d.msisdn = 3454159650; 

조인보다 쉽게 ​​이해하고 올바른 얻을 및 유지 관리 할 수 ​​있도록한다 : 둘째, 당신은 두 개의 재고 테이블 사이에 노동 조합을 원하는 것 같다.

편집 :

일부 테이블에는 일부 레코드가 누락되었을 수 있습니다. left outer join과 함께이 버전을 사용해보십시오.

select d.msisdn, b.bdo_id 
from details d left outer join 
    (select i.* 
     from (select i.* from inventory i union all 
      select i2.* from inventory i2 
      ) i 
    ) i 
    details d 
    on d.allocationid = i.allocationid left outer join 
    bdo b 
    on i.bdo_id=b.bdo_id 
where d.msisdn = 3454159650; 
+0

이것은 아무런 결과도 얻지 못합니다. 원하는 것은 할당 ID가 재고가 적거나 inventory2에있는 경우 결과가 있어야한다는 것입니다. –

1

쿼리가 반환되지 않습니다. 이 쿼리는 오류를 발생시킵니다.쿼리의 마지막 행이

and (c.bdo_id = b.bdo_id) or (d.bdo_id = b.bdo_id) 

C는 인벤토리 테이블 및 재고 테이블 bdo_id 아무 열 이름이 없습니다입니다

D는 inventory2 테이블과 inventory2 테이블에는 열 이름이 없습니다 bdo_id

관련 문제