#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