2012-10-09 2 views
1

다른 결과를 반환하는 2 개의 SQL 쿼리가 있습니다. 두 쿼리 모두 동일한 조인 작업을 사용하지만 IN 절 내부의 조인 매개 변수에 다른 바인딩을 사용합니다.내부 SQL이 조인 결과에 영향을 미침

처음에는 join 매개 변수를 직접 참조합니다. 두 번째에는 무료 컨텍스트 쿼리를 사용합니다. 다른 결과가 나타나고 그 이유를 알고 싶습니다.

-- this one returns 13 tuples 
select c.companyname 
    from companies as c 
    join stocklist as s 
    using (companyid) 
    where s.price in((select MAX(s.price)),(select MIN(s.price))); 




--this one returns two tuples. as it should 
select companyname 
    from companies join stockslist 
    using (companyid) 
    where price in(
    (select max(price) from stockslist),(select min(price) from stockslist) 
    ); 

답변

3

당신은 명명 된 인스턴스 stockslist 테이블의s 생각할 수 있습니다. 정확히는 사실이 아니지만 그렇게 생각하면 도움이됩니다.

내부 쿼리의 외부 쿼리에서 명명 된 테이블을 사용하면 해당 특정 행의 값을 사용하여 외부 테이블의 각 행에 대한 내부 쿼리를 수행합니다.

-- this one returns 13 tuples 
select c.companyname 
    from companies as c 
    join stocklist as s 
    using (companyid) 
    where s.price in(s.price,s.price) 
+0

1 :

귀하의 상위 쿼리는 본질적으로 동일합니다. 전문 용어로는 첫 번째 쿼리에는 * 상관 관계가있는 * 하위 쿼리가 있으며 (두 번째 쿼리에는 외부 쿼리의 현재 레코드와 "상관 관계가 있음"), 두 번째 쿼리에는 * 무관계 * 하위 쿼리가 있습니다 (전혀 참조하지 않습니다 다른 쿼리의 내용으로). – ruakh

+0

+1 나는 그것을 몰랐다. 고마워. :) – MimiEAM

관련 문제