Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

379
Visualizações
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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda