首页 > 解决方案 > 如何在查询中动态传递 id

问题描述

在下面的查询中,我需要传递一个动态的 person_id,它必须运行到表中的最后一个 person_id。

select 
  rb.pk_room_bed_id,rb.fk_hostel_floor_room_id,
  hfr.fk_room_type_id,hfr.fk_room_share_type_id,hf.fk_hostel_id,
  pba.fk_person_id,rsp.price,rb.vacated_date,rb.allotted_date
from room_bed rb,
  hostel_floor_room hfr,
  hostel_floor hf,
  person_bed_allocation pba,
  room_share_price rsp,person ps
where 
  hfr.pk_hostel_floor_room_id = rb.fk_hostel_floor_room_id and
  hf.pk_hostel_floor_id = hfr.fk_hostel_floor_id and
  rsp.fk_hostel_id = hf.fk_hostel_id and
  rsp.fk_room_share_type_id= hfr.fk_room_share_type_id and
  hfr.fk_room_type_id = rsp.fk_room_type_id and
  pba.fk_room_bed_id = rb.pk_room_bed_id and
  pba.fk_person_id = 1;   

标签: sqlpostgresql

解决方案


您可以使用内联子查询来确定该值。我假设最后一个 person_id 来自 person 表,因此请记住:

select 
  rb.pk_room_bed_id,rb.fk_hostel_floor_room_id,
  hfr.fk_room_type_id,hfr.fk_room_share_type_id,hf.fk_hostel_id,
  pba.fk_person_id,rsp.price,rb.vacated_date,rb.allotted_date
from
  room_bed rb,
  hostel_floor_room hfr,
  hostel_floor hf,
  person_bed_allocation pba,
  room_share_price rsp,
  person ps
where 
  hfr.pk_hostel_floor_room_id = rb.fk_hostel_floor_room_id and
  hf.pk_hostel_floor_id = hfr.fk_hostel_floor_id and
  rsp.fk_hostel_id = hf.fk_hostel_id and
  rsp.fk_room_share_type_id= hfr.fk_room_share_type_id and
  hfr.fk_room_type_id = rsp.fk_room_type_id and
  pba.fk_room_bed_id = rb.pk_room_bed_id and
  pba.fk_person_id = (select max (person_id) from person)

此外,您的语法是非 ANSI 的。严格来说,这并没有什么问题,但据我所知,你缺少一个连接。您已列出该person表,但该表没有连接条件,这意味着您只是调用了交叉连接。我的猜测是这不是你的意思。

ANSI 语法的优点之一是它可以更容易地识别丢失的连接。此查询转换为 ANSI 将显示连接丢失的位置:

select 
  rb.pk_room_bed_id,rb.fk_hostel_floor_room_id,
  hfr.fk_room_type_id,hfr.fk_room_share_type_id,hf.fk_hostel_id,
  pba.fk_person_id,rsp.price,rb.vacated_date,rb.allotted_date
from
  room_bed rb
  join hostel_floor_room hfr on
    hfr.pk_hostel_floor_room_id = rb.fk_hostel_floor_room_id
  join hostel_floor hf on
    hf.pk_hostel_floor_id = hfr.fk_hostel_floor_id
  join person_bed_allocation pba on
    pba.fk_room_bed_id = rb.pk_room_bed_id
  join room_share_price rsp on
    rsp.fk_hostel_id = hf.fk_hostel_id and
    rsp.fk_room_share_type_id= hfr.fk_room_share_type_id and
    hfr.fk_room_type_id = rsp.fk_room_type_id
  join person ps on
    -- WOA -- someting is missing!
where 
  pba.fk_person_id = (select max (person_id) from person)

这至少会导致语法错误,而上面的查询可以工作,但会转换为:

cross join person ps

推荐阅读