Reputation: 21
I'm brand new to SQL and I'm trying to figure out why I'm getting an error. I'm trying to add 2 columns to a query.
Here is the original code:
select f.id ride_id,f.driver_id,f.fleetid,f.fare,f.tip,f.service_fee,(f.fare+f.tip+f.service_fee) total,f.pick_up_city,f.pick_up_state,f.created_at
from
(select r.id,ra.driver_id,r.created_at,r.pick_up_city,r.pick_up_state,ra.xid fleetid,
MAX(CASE WHEN cli.category='fare' THEN cli.amount ELSE NULL END)/100 fare,
MAX(CASE WHEN cli.category='gratuity' THEN cli.amount ELSE NULL END)/100 tip,
MAX(CASE WHEN cli.category='flywheel_service_fee' THEN cli.amount ELSE NULL END)/100 service_fee
from rides r,charges c,charge_line_items cli,(select distinct ri.id,h.driver_id,f.xid
from rides ri inner join hails h on ri.id=h.ride_id
inner join vehicles v on h.vehicle_id=v.id
inner join fleets f on v.fleet_id=f.id
where ri.status IN ('completed', 'waiting_for_payment_data', 'waiting_for_payment_instrument', 'processing_payment', 'payment_pending')
and h.status='completed' and ri.created_at between '2015-07-15 04:00:00' and '2015-09-11 04:00:00'
and f.xid in ('10202')) ra
where r.id=ra.id and r.id=c.ride_id and c.id=cli.charge_id
group by r.id,ra.xid,ra.driver_id) f
I'm trying to find the driver first_name and last_name. I am adding INNER JOIN drivers AS dr on h.driver_id::VARCHAR = dr.xid and the dr.first_name, dr.last_name in the SELECT clause. (I put asterisks around the piece I added.)
select f.id ride_id,f.driver_id,**dr.first_name,dr.last_name,**f.fleetid,f.fare,f.tip,f.service_fee,(f.fare+f.tip+f.service_fee) total,f.pick_up_city,f.pick_up_state,f.created_at
from
(select r.id,ra.driver_id,r.created_at,r.pick_up_city,r.pick_up_state,ra.xid fleetid,
MAX(CASE WHEN cli.category='fare' THEN cli.amount ELSE NULL END)/100 fare,
MAX(CASE WHEN cli.category='gratuity' THEN cli.amount ELSE NULL END)/100 tip,
MAX(CASE WHEN cli.category='flywheel_service_fee' THEN cli.amount ELSE NULL END)/100 service_fee
from rides r,charges c,charge_line_items cli,(select distinct ri.id,h.driver_id,f.xid
from rides ri inner join hails h on ri.id=h.ride_id
inner join vehicles v on h.vehicle_id=v.id
inner join fleets f on v.fleet_id=f.id
**inner join drivers AS dr on h.driver_id::VARCHAR = dr.xid**
where ri.status IN ('completed', 'waiting_for_payment_data', 'waiting_for_payment_instrument', 'processing_payment', 'payment_pending')
and h.status='completed' and ri.created_at between '2015-07-15 04:00:00' and '2015-09-11 04:00:00'
and f.xid in ('10202')) ra
where r.id=ra.id and r.id=c.ride_id and c.id=cli.charge_id
group by r.id,ra.xid,ra.driver_id) f
When I run this query, I get an error saying "missing FROM-clause entry for table dr". Normally, I could just JOIN the table I want to SELECT from but for some reason, there is something in the query that is not letting me do this.
Any help would be greatly appreciated. I am still learning and really want to figure out what I'm doing wrong.
Thanks!
Upvotes: 2
Views: 789
Reputation: 32234
You have added the JOIN
in a second-level sub-query. That is fine, but you have to "propagate" the two columns in the select lists of the second-level sub-query out to the main level, using the aliases assigned to the sub-queries. Proper outlining of the code makes the error and the solution obvious:
SELECT f.id AS ride_id, f.driver_id,
f.first_name, f.last_name,
f.fleetid, f.fare, f.tip, f.service_fee, (f.fare+f.tip+f.service_fee) total,
f.pick_up_city, f.pick_up_state, f.created_at
FROM (
-- First sub-query starting
SELECT r.id, ra.driver_id, r.created_at, r.pick_up_city, r.pick_up_state, ra.xid AS fleetid,
ra.first_name, ra.last_name,
max(CASE WHEN cli.category = 'fare' THEN cli.amount ELSE NULL END)/100 fare,
max(CASE WHEN cli.category = 'gratuity' THEN cli.amount ELSE NULL END)/100 tip,
max(CASE WHEN cli.category= 'flywheel_service_fee' THEN cli.amount ELSE NULL END)/100 service_fee
FROM rides r, charges c, charge_line_items cli, (
-- Second sub-query starting
SELECT DISTINCT ri.id, h.driver_id, f.xid, dr.first_name, dr.last_name
FROM rides ri
INNER JOIN hails h ON ri.id = h.ride_id
INNER JOIN vehicles v ON h.vehicle_id = v.id
INNER JOIN fleets f ON v.fleet_id = f.id
INNER JOIN drivers dr ON h.driver_id::varchar = dr.xid
WHERE ri.status IN ('completed', 'waiting_for_payment_data', 'waiting_for_payment_instrument', 'processing_payment', 'payment_pending')
AND h.status = 'completed'
AND ri.created_at BETWEEN '2015-07-15 04:00:00' AND '2015-09-11 04:00:00'
AND f.xid IN ('10202')) ra
-- End of second sub-query
WHERE r.id = ra.id
AND r.id = c.ride_id
AND c.id = cli.charge_id
-- The below GROUP BY clause is incomplete, see added line
GROUP BY r.id, ra.xid, ra.driver_id
, r.created_at, r.pick_up_city, r.pick_up_state, ra.first_name, ra.last_name) f
-- End of first sub-query
;
Otherwise the original query is a curious mix of coding styles, with - for instance - two styles for listing multiple tables (comma-separated and JOIN
clause), odd capitalization and - as you have just learned - crappy outlining. Seems like you are not the only one who has some things to learn...
Upvotes: 1