2009-12-05 4 views
0

Qbe를 사용하여 액세스 할 때 다음 sql 쿼리 코드를 생성하고이를 SQL로 변환했습니다. 나는 도움없이 모든 내부 조인 문을 꺼내 WHERE 문으로 대체하려고합니다. 어떻게 해결할 수 있을까요? 설명하고 답변 해주십시오. 고맙습니다.내부 조인 문을 사용하여 SQL 쿼리를 SQL 쿼리로 변환하는 방법 Where 문 (문에서 내부 조인 없음)

SQL 쿼리 :

 
SELECT Entertainer.EntertainerID, Entertainer.FirstName, Entertainer.LastName, 
     Booking.CustomerID, Booking.EventDate, BookingDetail.Category, BookingDetail.Duration, 
     Speciality.SpecialityDescription, EntertainerSpeciality.EntertainerSpecialityCost 

FROM (Entertainer INNER JOIN (Booking INNER JOIN BookingDetail ON 
           Booking.BookingID=BookingDetail.BookingID) ON 
     Entertainer.EntertainerID=BookingDetail.EntertainerID) 
INNER JOIN (Speciality INNER JOIN EntertainerSpeciality ON 
      Speciality.SpecialityID=EntertainerSpeciality.SpecialityID) ON 
Entertainer.EntertainerID=EntertainerSpeciality.EntertainerID 

WHERE (((Entertainer.EntertainerID)=[Enter EntertainerID])); 
+0

왜 INNER JOIN이이 작업을 선호합니다. –

+0

왜 그렇게하고 싶습니까? 그건 아무것도 증명하지 못합니다. – Donnie

+0

끔찍한 생각. 내부 조인은 그대로 두십시오. –

답변

0

그것은 수행 할 수있는 이상한 일이 (덧글 말하는대로, 내부 조인은 일반적으로 더 나은, 및 기계적 변형을 적용하는 것은 아무것도 증명하지 않습니다)하지만, 어려운 일이 아니다. 다음 각 INNER 기계적으로 WHERE로 변환 될 수 조인 대신 내부 각각 2 방향의

가입 A INNER JOIN B ON (cond1) WHERE (cond2)

재기록 그것을 A, B WHERE (cond1) AND (cond2)

어떤 테이블 AB 및 조건 cond1cond2로서 아마도.

+0

하지만 중첩 된 문장처럼 보입니다. 새로운 select 문을 시작하고 중첩을 계속하려면 무엇을해야합니까? 나의 공제에서 Cus 나는 예약 테이블이 bookingdetails 테이블과 조인되고 결과가 오락 테이블에 합쳐지는 것을 본다. Where 문을 사용했다면 어떻게 표현합니까? – Selase

+0

내부 조인의 중첩은 부적절합니다. '내부 조인 (B 내부 조인 C 1)에서 c 2 ON c 2 어디 c 3'따라서 'SELECT ... FROM A, B, C where c1 AND c2 AND c3 '. –

4

나는 지금까지 본 이상한 JOIN 문이다. 다음 쿼리는 ANSI-89 구문으로 변환됩니다 : 여기

SELECT e.entertainerid, 
     e.firstname, 
     e.lastname, 
     b.customerid, 
     b.eventdate, 
     bd.category, 
     bd.duration, 
     s.specialitydescription, 
     es.entertainerspecialitycost 
    FROM Entertainer e, 
     BookingDetail bd, 
     Booking b, 
     EntertainerSpeciality es, 
     Speciality s 
WHERE e.entertainerid = bd.entertainerid 
    AND b.bookingid = bd.bookingid 
    AND e.entertainerid = es.entertainerid 
    AND s.specialityid = es.specialityid 
    AND e.entertainerid = [Enter EntertainerID] 

구문을 원래 쿼리가 정리 - 그것은 쉽게 일반적인 정보를 볼 수 있도록 도움이 될 것입니다

SELECT e.entertainerid, 
     e.firstname, 
     e.lastname, 
     b.customerid, 
     b.eventdate, 
     bd.category, 
     bd.duration, 
     s.specialitydescription, 
     es.entertainerspecialitycost 
    FROM ENTERTAINER e 
    JOIN BOOKINGDETAIL bd ON bd.entertainerid = e.entertainerid 
    JOIN BOOKING b ON b.bookingid = bd.bookingid 
    JOIN ENTERTAINERSPECIALITY es ON es.entertainerid = e.entertainerid 
    JOIN SPECIALITY s ON s.specialityid = es.specialityid 
WHERE e.entertainerid = ? 

는 차이가이다 ANSI-89 구문에는 실제 필터 조건과 함께 WHERE 절에 조인 기준이 포함됩니다.

FROM ENTERTAINER e 
    JOIN BOOKINGDETAIL bd ON bd.entertainerid = e.entertainerid 

... ANSI-89 대 :

FROM ENTERTAINER e, 
     BOOKINGDETAIL bd 
     ,... -- omitted for purpose of example 
WHERE e.entertainerid = bd.entertainerid 

ANSI-92 구문을 선호 :

  • ANSI-89이 일관하지 않았다 ANSI-92, 강조 표시 다양한 데이터베이스에서 LEFT JOIN 구문을 구현 했으므로 이식성이 뛰어났습니다.
  • ANSI-92는보다 강력한 JOIN을 제공합니다 (IE : x ON x.id = y.id 및 x.col IS NOT NULL)
  • ANSI-92는 실제 필터 기준에서 조인 기준을 분리하기가 더 쉽습니다.
+0

그게 굉장 했어 ... 고맙습니다 ..... – Selase

+0

어디서 감가 상각되었는데 더 이상 사용해서는 안되는 것을 사용하는 이런 종류의 합류입니다. – Johan

+0

@ Johan : 둘 중 하나를 선택하는 이유를 설명하는 답변이 동일한 쿼리 계획을 생성합니다. 그래서 요점은 무엇입니까? –