I have 3 tables. 1st table stores coil information, 2nd table store coil information in transport and 3rd stores reserved coils.
- coils
ID | SERIAL | COLOR | MATERIAL | STATUS |
---|---|---|---|---|
1 | 12345 | 5 | 1 | 2 |
2 | 12346 | 4 | 1 | 3 |
3 | 12347 | 3 | 1 | 2 |
- coils_in_transport
ID | SERIAL | COLOR | MATERIAL | STATUS |
---|---|---|---|---|
1 | f34S5 | 5 | 1 | 2 |
2 | A23GG6 | 4 | 1 | 3 |
3 | ff2S147 | 3 | 1 | 2 |
- reserved_coils
ID | NUMBER | QUANTITY | START | END |
---|---|---|---|---|
1 | 12345 | 25 | 2022-05-01 | 2023-05-01 |
3 | 12347 | 252 | 2022-01-01 | 2023-05-01 |
4 | A23GG6 | 33 | 2022-04-01 | 2023-05-01 |
5 | ff2S147 | 35 | 2022-08-01 | 2023-05-01 |
I need to write query that will get all reserved coils (reserved_coils) that has status 2 and for each coil I need to join tables for materials and colors
material
ID | NAME |
---|---|
1 |
color
ID | NAME |
---|
I wrote query but it doesn't show coils in transport that are reserved, here is what I tried
SELECT a.QUANTITY, a.START, a.END, b.name, m.name
FROM reserved_coils a
LEFT JOIN coils b ON a.number = b.serial
LEFT JOIN coils_in_transport c ON a.number = c.serial
LEFT JOIN material m ON b.material = m.id
LEFT JOIN material b ON b.material = b.id
where b.status = 2 and c.status = 2
CodePudding user response:
To get all coils
and colis_in_transport
you need to use UNION
for SELECT
statements for both tables, each filtered by status
value, which should be equal to 2
. Then you need to do a JOIN
between reserved_coils
and the result of UNION
to filter out reserved_coils
rows.
Your query would be like this
SELECT
r.quantity,
r.start,
r.[end],
c.serial,
material.name AS material,
color.name AS color
FROM reserved_coils r
JOIN (
SELECT * FROM coils WHERE status = 2
UNION
SELECT * FROM coils_in_transport WHERE status = 2
) c ON r.number = c.serial
LEFT JOIN material ON material.id = c.material
LEFT JOIN color ON color.id = c.color
CodePudding user response:
If you want left join twice on same table, this might help
SELECT a.QUANTITY, a.START, a.[END], isnull(b.serial,c.serial) serial,isnull(c1.name,c2.name) color, isnull(m.name,n.name) material
FROM reserved_coils a
LEFT JOIN coils b ON a.number = b.serial
LEFT JOIN coils_in_transport c ON a.number = c.serial
LEFT JOIN material m ON b.material = m.id
LEFT JOIN material n ON c.material = n.id
LEFT JOIN color c1 on b.color=c1.id
LEFT JOIN color c2 on c.color=c2.id
where isnull(b.status,c.status) = 2