Tengo problemas para escribir una selección de diagrama en la imagen. 
Lo que quiero hacer es escribir una selección, que me mostrará los detalles de la reparación de un automóvil. Como puede ver en la tabla Repairs , solo hay 2 atributos, pero no estoy seguro de si es necesario agregar más, especialmente los de employees_list y parts_list , ya que quiero mostrar los datos de reparación de cada vehículo por su plate_number . Por datos de reparación me refiero a la id de la reparación, el número de plate_number del vehículo, todos los empleados que trabajan en la reparación y todas las piezas utilizadas en la reparación. Si mi diagrama es incorrecto, ayúdenme a corregirlo y no tengo idea de cómo escribir select para esto debido a la relación de muchos a muchos y al uso de tablas vinculantes.
Esto no es tan difícil como puede parecer.
Primero, obviamente, tenemos que seleccionar los autos:
select vehicles.* from vehiclesentonces, unamos las reparaciones:
select vehicles.* from vehicles inner join repairs on vehicles.id = repairs.vehicle.idNo necesitamos datos de reparaciones en el conjunto de resultados, por lo que simplemente los unimos pero no los mencionamos en la parte 'seleccionar'.
Luego tenemos que unir las piezas necesarias para la reparación y la información sobre las piezas en sí:
select vehicles.* from vehicles inner join repairs on vehicles.id = repairs.vehicle.id inner join parts_list on parts_list.repair_id = repairs.id inner join parts on parts_list.part_id = parts.idPara esa consulta, obtenemos una cantidad de filas equivalente a la cantidad de piezas necesarias para la reparación. Pero sería más fácil manejar dichos datos en el código si los agregamos todos en la columna json. Entonces, en el conjunto de resultados, veremos algo como: id_vehículo, parte_vehículo, partes_necesarias_as_json
Vamos a agregar esto:
select vehicles.*, json_agg(parts.*) as parts_needed from vehicles inner join repairs on vehicles.id = repairs.vehicle_id inner join parts_list on parts_list.repair_id = repairs.id inner join parts on parts_list.part_id = parts.id group by vehicles.id, repairs.idAhora puede agregar la misma lógica para los empleados:
select vehicles.*, json_agg(parts.*) as parts_needed, json_agg(employes.*) as employees_needed from vehicles inner join repairs on vehicles.id = repairs.vehicle.id inner join parts_list on parts_list.repair_id = repairs.id inner join parts on parts_list.part_id = parts.id inner join employees_list on employes_list.repair_id = repairs.id inner join employees on employees_list.employee_id = employees.id group by vehicles.id, repairs.idPor cierto, le sugiero que cambie el nombre de sus tablas a minúsculas y singulares. Como: 'reparación', 'empleado' y 'vehículo';
Además, nombre sus tablas de enlace como: 'repair_part' y 'repair_employee'. Algunas personas incluso sugieren organizar las tablas relacionadas en esos nombres por orden alfabético, como: 'reparación_empleado' y 'reparación_parte', pero creo que no es obligatorio;
Tal vez sea una cuestión de gusto, pero en la mayoría de los casos esto conduce a consultas más legibles.
Es decir, la consulta anterior se verá así:
select vehicle.*, json_agg(part.*) as parts_needed, json_agg(employee.*) as employees_needed from vehicle inner join repair on vehicle.id = repair.vehicle_id inner join parts_repair on parts_repair.repair_id = repair.id inner join part on parts_repair.part_id = part.id inner join employees_repair on employees_repair.repair_id = repair.id inner join employee on employees_repair.employee_id = employee.id group by vehicle.id, repair.idTenga en cuenta lo elegantes que se ven ahora las condiciones de 'encendido': parts_repair.part_id = part.id, parts_repair.part_id = part.id
Lo siento por mal inglés