• Empleos
  • Sobre nosotros
  • Empleos
    • Inicio
    • Empleos
    • Cursos y retos
  • Empresas
    • Inicio
    • Publicar vacante
    • Nuestro proceso
    • Precios
    • Evaluaciones
    • Nómina
    • Blog
    • Comercial
    • Calculadora de salario

0

292
Vistas
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 3 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

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 3 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Nuestro proceso Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.

Andres GPT

Recomiéndame algunas ofertas
Necesito ayuda