Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

390
Views
Selección de SQL para una relación de muchos a muchos usando la tabla de enlace

Tengo problemas para escribir una selección de diagrama en la imagen. 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.

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

Esto no es tan difícil como puede parecer.

Primero, obviamente, tenemos que seleccionar los autos:

 select vehicles.* from vehicles

entonces, unamos las reparaciones:

 select vehicles.* from vehicles inner join repairs on vehicles.id = repairs.vehicle.id

No 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.id

Para 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.id

Ahora 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.id

Por 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.id

Tenga 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

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!