2011-04-30 3 views
1

나는 확실하지 않습니다. 아래 그림과 같이 코드를 입력하여 Microsoft SQL Server Management Studio 2008에서 하위 쿼리를 수행하는 예제 (ms SQL Server의 northwind datase에서)를 수행 할 때, 하위 쿼리와자동으로 조인을 생성하는 하위 쿼리

Select Orders.OrderID, 
     (Select Customers.CompanyName 
      From Customers 
      Where Customers.CustomerID = Orders.CustomerID) As Company Name 
    From Orders, 
     Customers 

이 SQL 코드가 자동으로 십자가에 가입하고

Select Orders.OrderID, 
      (Select Customers.CompanyName 
       From Customers 
      Where Customers.CustomerID = Orders.CustomerID) As Company Name 
     From Orders 
CROSS JOIN Customers as Customers_1 

나는이 여러 변화에 있지만,이 문제를 제거하는 행운과 주위 해왔다하게되었습니다. 이 Microsoft SQL Server 관리 스튜디오 2008 알려진 버그가 있습니까? 그렇다면 패치를 받았는지, 어떻게 패치를 찾았습니까? 그렇지 않은 경우이를 어떻게 Microsoft에보고하여 신속하게 해결할 수 있습니까?

내 실제 쿼리에서 ID를 동일시하여 약 50 번이 특정 테이블의 이름을 조회/조회해야합니다. 코드가 울퉁불퉁하기 때문에 어떤 종류의 조인도 필요하지 않습니다. , 매우 길며 성능이 떨어질 수 있습니다.

+0

쿼리는 동일합니다. 첫 번째는 ANSI-89 구문을 사용하고 후자는 ANSI-92 구문을 사용합니다. subselect는 주문과 고객의 데카르트 제품이 있다는 것을 변경하지 않습니다 ... –

답변

2

하위 쿼리가 교차 조인을 일으키지 않아 조인을 제어하는 ​​조건이 부족합니다. 서브 쿼리가 책에 의해 제안 이유

Select Orders.OrderID, (Select Customers.CompanyName From Customers Where Customers.CustomerID = Orders.CustomerID) As Company Name 
From Orders, Customers 
Where Orders.CustomerID = Customers.CustomerID 
+0

당신의 가장 친절한 답장을 주셔서 감사합니다.하지만 서브 쿼리를 수행하는 목적이 아닙니다. 서브 쿼리 내에서만 조건을 제어 할 수 있다는 것입니다. 주 Select의 WHERE 절에서 다시 반복 할 필요가 없습니다. –

+0

도움이되기를 바랍니다! – squawknull

+0

하지만 하위 쿼리를 수행하는 목적이 아니므로 하위 쿼리에서만 조건을 제어 할 수 있으며 기본 Select의 WHERE 절에서 다시 반복 할 필요가 없습니다 ??? 예를 들어,이 특정 테이블을 "조회/쿼리"50 번해야하고 Where 절은 Where (Orders.CustomerID = Customers.CustomerID) 및 (Orders.CustomerID1 = Customers.CustomerID) 및 (Orders.CustomerID2 = Customers)와 같을 것입니다. CustomerID) and ... 마지막으로, 나는 어떤 결과가 돌아올 지 모른다. ??? 친절하게 도와주세요! –

1

나도 몰라 -이처럼 할 것 :이 같은 뭔가가 필요 그것이이어야한다처럼

Select Orders.OrderID, Customers.CompanyName 
    From Orders 
    left join Customers on Customers.CustomerID = Orders.CustomerID 
0

가 보이는 상관 - 하위 쿼리

선택 Orders.OrderID,

(Select Customers.CompanyName 
     From Customers 
     Where **Customers.CustomerID = Orders.CustomerID**) As Company Name 

주문

,536에서

- - 고객

내부 상관 하위 쿼리가 처리 될 때마다 주문에 대한 고객의 이름을 제공합니다 다시 왜 당신이 고객 필요?

CROSS JOIN 추가에 대한 Management Studio의 주장은 사용자가 이상한 일을한다고 경고합니다. 고객, 조인 조건이없는 주문 두 테이블을 쿼리하려고합니다.

또한 쿼리 최적화 프로그램은 일반적으로 상관 관계가있는 하위 쿼리를 처리 중에 조인으로 변환하지만 필요한 경우 명확한 구문을 사용할 수 있습니다.

어디에 적절합니까? 특히 내부 쿼리에서 일종의 집계를 생성해야하는 경우

관련 문제