SQL使用绑定表

时间:2017-04-25 19:02:30

标签: sql database postgresql select

我正在努力为图片编写一个选择图表。picture

我想要做的是写一个选择,它会显示汽车维修的详细信息。正如您在表Repairs中看到的,只有2个属性,但我不确定是否需要添加更多属性,特别是employees_listparts_list中的属性,因为我想要显示每辆车的维修数据plate_number。通过维修数据,我的意思是修理id,车辆plate_number,所有从事维修工作的员工以及维修时使用的所有部件。如果我的图表错了,请帮我修复它,我不知道如何编写select for this,因为有多对多的关系和绑定表的使用。

1 个答案:

答案 0 :(得分:0)

这并不像看起来那么难。

首先,显然,我们必须选择汽车:

select vehicles.* from vehicles

然后,让我们加入修理:

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

我们不需要修改套装中的维修数据,所以我们只是加入,但没有提及“选择”。部分。

然后我们必须加入维修所需的零件,以及零件本身的信息:

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

对于该查询,我们得到相当于修复所需部件数量的行数。但是如果我们将所有这些数据聚合到json列中,那么在代码中处理这些数据会更容易。所以在结果集中我们会看到类似的东西: vehicle_id,vehicle_part,parts_needed_as_json

让我们聚合:

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

现在您可以为员工添加相同的逻辑:

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

顺便说一句,我建议你把你的桌子重命名为小写和单面。 喜欢:'维修','员工'和' vehicle&#39 ;;

另外,将绑定表命名为:' repair_part'和' repair_employee'。 有些人甚至建议按字母顺序排列相关表格,例如:' employee_repair'和' part_repair',但我认为不需要;

也许这是一个品味问题,但在大多数情况下,这会导致更具可读性的查询。

即,上面的查询将如下所示:

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

注意优雅' on'条件现在看起来:parts_repair.part_id = part.id,parts_repair.part_id = part.id

抱歉英语不好