2013-02-02 5 views
1

을 바인딩 할 수 없습니다내부 적용 크로스 대 가입하기 - 멀티 부분 식별자는 다음 스키마 고려

create table TableA (A1 int) 
create table TableB (B1 int, B2 int) 
create table TableC (C1 int, C2 int) 
create table TableD (D1 int) 

그리고 다음 쿼리 :

SELECT * 
FROM TableA a 
INNER JOIN TableB b ON b.B1=a.A1 
INNER JOIN (SELECT TOP 1 * 
      FROM TableC c 
      WHERE c.C1=b.B1 ORDER BY c.C2) foo ON foo.C1=a.A1 
INNER JOIN TableD d ON d.D1=foo.C1 
SQL 바이올린에서

(2008 SQL 서버) I 오

The multi-part identifier "b.B1" could not be bound.: SELECT * FROM TableA a INNER JOIN TableB b ON b.B1=a.A1 INNER JOIN (SELECT TOP 1 * FROM TableC c WHERE c.C1=b.B1 ORDER BY c.C2) foo ON foo.C1=a.A1 INNER JOIN TableD d ON d.D1=foo.C1 

그러나 INNER가 가입 교체 : 다음과 같은 결과를 얻을 수 첫 번째 쿼리가 실패하는 이유

1) :

SELECT * 
FROM TableA a 
INNER JOIN TableB b ON b.B1=a.A1 
CROSS APPLY (SELECT TOP 1 * 
      FROM TableC c 
      WHERE c.C1=b.B1 AND c.C1=a.A1 ORDER BY c.C2) foo 
INNER JOIN TableD d ON d.D1=foo.C1 

내 질문

은 다음과 같습니다 CROSS으로 하위 쿼리 f를 수정에게 문제를 적용?

2) 두 번째 쿼리가 실패하지 않는 이유는 무엇입니까?

3) CROSS APPLY은 SQL Server에만 해당됩니다. 이 문제에 대한 SQL 표준 솔루션은 무엇입니까?

중요 사항 : TableA, ..., TableD 뒤에있는 논리를 이해하려고하지 마십시오. 그것들은 더 복잡한 쿼리에 대한 추상화 일뿐입니다. 나는 당신이 그 이슈에 대한 아이디어를 얻을 것이라고 생각합니다.

답변

3

from 절에는 상관 관계가있는 하위 쿼리가 허용되지 않습니다. 그렇기 때문에 inner join 버전이 작동하지 않습니다. 나는이 사실을 실제로 알지 못한다. 한 가지 문제점은 의존성에서 순환을 얻을 수 있다는 것인데, 발견하기가 어렵지는 않지만 쿼리를 처리 할 수 ​​없게 만듭니다.

cross apply의 검색어는 cross apply이 적합한 경우입니다. 그러나 큰 데이터에서 얼마나 잘 실행되는지 모르겠습니다.

SELECT * 
FROM TableA a 
INNER JOIN TableB b ON b.B1=a.A1 
INNER JOIN (select * 
      from (select c.*, row_number() over (partition by c1 order by c2) 
        FROM TableC c 
       ) c 
      where seqnum = 1 and foo.C1=a.A1 and c.C1=b.B1 
      ) foo 
INNER JOIN TableD d ON d.D1=foo.C1 
+1

당신은 괄호와 별칭 누락 : 여기

표준 SQL에서 그것을 다시 시도이다 ON') foo는 ...' –