Reputation: 3098
I'm a SQL novice trying to write a select query that involves a join of multiple tables, with one table multiple times.
The relationships are shown below:
The output of the query I'm trying to achieve is this:
Truck_ID|Pushbutton_ID|Trailer01_ID|Trailer02_ID|Trailer03_ID|Trailer04_ID|Trailer05_ID
The joining of the tables Trucks
and Pushbutton_Assignments
is straightforward. The difficulty is joining the Trailer_Assignment
table multiple times.
The structure of Trailer_Assignments
is:
Trailer_ID|Truck_ID|Order
The Trailer_ID
and Truck_ID
fields have foreign key relationships with other tables. The TrailerXX_ID
fields of the query are related to the Order
field of the Trailer_Assignment
table; all records with Order == 1
have Trailer_ID
put in Trailer01_ID
, records with Order == 2
to Trailer02_ID
and so on.
I based my query from here. It works for a single column but Access (I think) doesn't like subsequent columns.
Working Query code (single column):
SELECT Trucks.ID,
Pushbutton_Assignment.Pushbutton_ID,
Trailer_Assignment.Trailer_ID AS Trailer01_ID,
Trailer_Assignment.Trailer_ID AS Trailer02_ID,
Trailer_Assignment.Trailer_ID AS Trailer03_ID,
Trailer_Assignment.Trailer_ID AS Trailer04_ID,
Trailer_Assignment.Trailer_ID AS Trailer05_ID
FROM (Trucks LEFT JOIN Pushbutton_Assignment ON Trucks.ID = Pushbutton_Assignment.Truck_ID) LEFT JOIN Trailer_Assignment ON Trucks.ID = Trailer_Assignment.Truck_ID AND Trailer_Assignment.Order = 1;
EDIT:
Non-working Query code (two column):
SELECT Trucks.ID,
Pushbutton_Assignment.Pushbutton_ID,
Trailer_Assignment.Trailer_ID AS Trailer01_ID,
Trailer_Assignment.Trailer_ID AS Trailer02_ID,
Trailer_Assignment.Trailer_ID AS Trailer03_ID,
Trailer_Assignment.Trailer_ID AS Trailer04_ID,
Trailer_Assignment.Trailer_ID AS Trailer05_ID
(((FROM (Trucks LEFT JOIN Pushbutton_Assignment ON Trucks.ID = Pushbutton_Assignment.Truck_ID))
LEFT JOIN Trailer_Assignment ON (Trucks.ID = Trailer_Assignment.Truck_ID AND Trailer_Assignment.Order = 1))
LEFT JOIN Trailer_Assignment ON (Trucks.ID = Trailer_Assignment.Truck_ID AND Trailer_Assignment.Order = 2));
This is using Access 2003.
Upvotes: 1
Views: 1714
Reputation: 1270713
MS Access has all sorts of weird restrictions, such as difficulty handling constants in LEFT JOIN
conditions. So, just surrender and use correlated subqueries . . . you only want one value anyway:
select t.id, pba.pushbutton_id,
(select top 1 ta.trailer_id from Trailer_Assignment as ta where ta.Truck_id = t.id and ta.order = 1
) as Trailer01_id,
(select top 1 ta.trailer_id from Trailer_Assignment as ta where ta.Truck_id = t.id and ta.order = 2
) as Trailer02_id,
(select top 1 ta.trailer_id from Trailer_Assignment as ta where ta.Truck_id = t.id and ta.order = 3
) as Trailer03_id,
(select top 1 ta.trailer_id from Trailer_Assignment as ta where ta.Truck_id = t.id and ta.order = 4
) as Trailer04_id,
(select top 1 ta.trailer_id from Trailer_Assignment as ta where ta.Truck_id = t.id and ta.order = 5
) as Trailer05_id
from Trucks as t LEFT JOIN
Pushbutton_Assignment as pba
on t.id = pba.truck_id;
Upvotes: 1
Reputation: 49270
SELECT Trucks.ID,
Pushbutton_Assignment.Pushbutton_ID,
iif(ta.order = 1, ta.Trailer_ID, NULL) AS Trailer01_ID,
iif(ta.order = 2, ta.Trailer_ID, NULL) AS Trailer02_ID,
iif(ta.order = 3, ta.Trailer_ID, NULL) AS Trailer03_ID,
iif(ta.order = 4, ta.Trailer_ID, NULL) AS Trailer04_ID,
iif(ta.order = 5, ta.Trailer_ID, NULL) AS Trailer05_ID
FROM Trucks LEFT JOIN Pushbutton_Assignment
ON Trucks.ID = Pushbutton_Assignment.Truck_ID
LEFT JOIN Trailer_Assignment ta ON Trucks.ID = ta.Truck_ID
This is one more way to do it with if
statements. You would need to refer to the table only once. Add a where
clause if needed, to only look for orders 1,2,3,4 and 5.
Upvotes: 0
Reputation: 6979
As you are using the same table several times in your query, you need to provide an alias for each one:
SELECT Trucks.ID,
Pushbutton_Assignment.Pushbutton_ID,
ta1.Trailer_ID AS Trailer01_ID,
ta2.Trailer_ID AS Trailer02_ID,
ta3.Trailer_ID AS Trailer03_ID,
ta4.Trailer_ID AS Trailer04_ID,
ta5.Trailer_ID AS Trailer05_ID
FROM (Trucks LEFT JOIN Pushbutton_Assignment ON Trucks.ID = Pushbutton_Assignment.Truck_ID)
LEFT JOIN Trailer_Assignment ta1 ON Trucks.ID = ta1.Truck_ID AND ta1.Order = 1
LEFT JOIN Trailer_Assignment ta2 ON Trucks.ID = ta2.Truck_ID AND ta2.Order = 2
LEFT JOIN Trailer_Assignment ta3 ON Trucks.ID = ta3.Truck_ID AND ta3.Order = 3
LEFT JOIN Trailer_Assignment ta4 ON Trucks.ID = ta4.Truck_ID AND ta4.Order = 4
LEFT JOIN Trailer_Assignment ta5 ON Trucks.ID = ta5.Truck_ID AND ta5.Order = 5;
Upvotes: 0