Как преобразовать Sql-запрос с внутренним оператором соединения в SQL-запрос с помощью оператора Where (без внутреннего соединения в операторе) - PullRequest
0 голосов
/ 05 декабря 2009

Я сгенерировал следующий код запроса sql при доступе с использованием Qbe и преобразовал его в 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]));

Ответы [ 2 ]

4 голосов
/ 05 декабря 2009

Это самое странное утверждение 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, а также фактические критерии фильтрации. Чтобы выделить ANSI-92:

  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 не имел последовательно реализованного синтаксиса LEFT JOIN в различных базах данных, поэтому операторы были такими переносимыми
  • ANSI-92 обеспечивает более мощные соединения (т. Е. X ON x.id = y.id И x.col НЕДЕЙСТВИТЕЛЕН)
  • ANSI-92 легче читать, отделяя критерии объединения от фактических критериев фильтра
0 голосов
/ 05 декабря 2009

Странно хотеть делать (как говорят комментаторы, INNER JOIN обычно лучше, а применение механического преобразования ничего не доказывает), но не сложно. Каждое ВНУТРЕННЕЕ СОЕДИНЕНИЕ можно механически преобразовать в ГДЕ следующим образом:

вместо каждого 2-стороннего внутреннего соединения A INNER JOIN B ON (cond1) WHERE (cond2)

переписать его как A, B WHERE (cond1) AND (cond2)

независимо от таблиц A и B и условий cond1 и cond2 могут быть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...