Явное соединение с неявным соединением sql

#mysql #inner-join

#mysql #внутреннее соединение

Вопрос:

Я новичок в SQL и пытался написать запрос с использованием явного соединения для повышения производительности по сравнению с неявным соединением

 SELECT 
r.TicketNumber,
r.VendorNumber,
r.VendorName,
rd.FromCityCode,
rd.ToCityName,
et.TravelDate,
tc.TotalAmount,
tc.AmountInvoiced,
FROM Reservations as r,
ReservationDetails as rd,
Trips as t,
TripCosts as tc
WHERE r.ProductCode='1'
AND t.TravelDate < '2016-11-23 00:00:00.0'
AND t.TravelDate > '2016-10-23 00:00:00.0'
AND t.TripID = r.TripID
AND r.ReservationID=rd.ReservationID
AND t.TripID = tc.TripID;
 

Когда я превращаю его во ВНУТРЕННЕЕ СОЕДИНЕНИЕ

 SELECT 
r.TicketNumber,
r.VendorNumber,
r.VendorName,
rd.FromCityCode,
rd.ToCityName,
t.TravelDate,
tb.TotalAmount,
tb.AmountInvoiced
FROM Reservations as r
  JOIN ReservationDetails as rd ON rd.ReservationID=r.ReservationID
  JOIN Trips as t ON TripID = r.TripID
  JOIN TripBalances as tb ON tb.TripID = t.TripID
WHERE r.ProductCode='1'
AND t.TravelDate < '2016-11-23 00:00:00.0'
AND t.TravelDate > '2016-10-23 00:00:00.0'
 

Когда я запускаю запрос внутреннего соединения, я получаю

 Error: Ambiguous column name 'TripID'.
SQLState:  S0001
ErrorCode: 209
 

Что я делаю не так?

Ответ №1:

Поскольку у вас отсутствует alias имя в TripID

 JOIN Trips as t ON t.TripID = r.TripID
                 --^here
 

Также нет никакого прироста производительности при использовании одного над другим. Явное соединение более читаемо, чем неявное соединение. Оба будут иметь идентичные планы выполнения

Комментарии:

1. Большое спасибо, что указали на мою глупую ошибку. Другой вопрос, какой самый чистый способ создавать такие длинные запросы на Java вместо использования String ?? Есть ли лучший способ? Спасибо

2. @user2070333 — Я специалист по базам данных, не уверен в Java