Несколько внутренних объединений, производящих слишком много строк - PullRequest
1 голос
/ 14 марта 2011

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

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

Я работаю над бухгалтерским отчетом, в котором по счету будет показано количество поездок.для этой учетной записи, общее количество миль, пройденных по этой учетной записи, умножается на определенную плату, и общее количество часов, которое каждый водитель проехал в этой поездке, умножается на их выплату.

У меня есть полеtrip (tripid = 1) с двумя транспортными средствами и двумя водителями, и я ожидаю два ряда выходных.Тем не менее, я получаю 4 строки;Два ряда для транспортного средства 81 и два ряда для транспортного средства 56. Есть ли в моих объединениях что-то, что приводит к выводу слишком большого количества строк?

Что странного в том, что Мистер Драйвер находится на обоих транспортных средствах в выводе моего запроса и т.является родовой личностью.

select distinct
       tdv.tripid as tripid,
       ta.name as account,
       cb.chargebasisname as trip_type,
       cb.defaultdistancerate as distance_rate,
       (tc.odometerreturn-tc.odometerstart) as total_miles,
       datediff(hour, tc.actualoriginstarttime,tc.actualoriginreturntime) as total_hours,
       v.vehicle,
       pr.hourlyrate as driver_rate,
       e.firstname+' '+e.lastname as driver

from trip_tripdrivervehicle tdv

join trip_tripinformation ti
on ti.recordid = tdv.tripid

join trip_transportationaccounts ta
on ta.recordid = ti.accountid

join trip_invoicechargebasis cb
on cb.recordid = ta.defaultchargebasisid

join trip_tripcompletion tc
on tc.tripid = ti.recordid

join vehicles v
on v.recordid = tc.vehicleid

join trip_employeejobcategorypayrate pr
on pr.employeeid = tdv.driverid

join employees e
on e.recordid = tdv.driverid

where ti.triprequeststatusid = 7 and ti.recordid = 1

Вот мой вывод:

https://lh6.googleusercontent.com/_Bbr20KcwLyw/TX5cwDhr7BI/AAAAAAAAbYE/qCfQtk6Xmeg/s800/sql_results.jpg

1 Ответ

1 голос
/ 14 марта 2011

Похоже, что у вас также есть два совпадения для JOIN с таблицей trip_tripcompletion - один, который дает строки с общим количеством миль 10, и другой, который дает строки с общим количеством миль 50.

Таким образом, появляется каждый водительс каждым параметром total_miles.

Может потребоваться изменить условие JOIN для этой таблицы, или вы можете использовать GROUP BY вместе с MAX/MIN, чтобы показать только самое короткое / самое длинное путешествие (в зависимости от необходимости).

...