from子句中的子查询,Where子句中的无效标识符

时间:2014-05-01 17:45:30

标签: sql oracle

select * from iiasa_inventory.inv_device    d                         
  join iiasa_inventory.inv_type ty on d.type_id = ty.id
  join iiasa_inventory.inv_category c on ty.category_id = c.id
  join iiasa_inventory.inv_device_2_barcode b on b.device_id = d.id
  join iiasa_inventory.inv_barcodes bc on b.barcode_id = bc.id
  join iiasa_inventory.inv_status s on d.status = s.id
  join iiasa_inventory.inv_brand br on ty.brand_id = br.id
  left join iiasa_inventory.inv_supplier su on su.id = d.supplier_id
  left join iiasa_inventory.inv_supplier sup on sup.id = d.maintenance_with
  left join (select distinct device_id from 
  iiasa_inventory.inv_device_2_persons_cc) dp
  on dp.device_id = d.id 
  where dp.active = 1

我正在尝试选择我的数据但where子句说“dp.active”是一个无效标识符。这可能是因为表dp在子查询中。我试图给它一个别名和我在浏览stackoverflow时发现的其他一些东西,但我似乎无法找到解决方案。有什么想法吗?

这是Oracle PL / SQL。

2 个答案:

答案 0 :(得分:1)

将检查active = 1放在子查询中,如下所示。

select * from iiasa_inventory.inv_device    d                         
                                  join iiasa_inventory.inv_type ty on d.type_id = ty.id
                                  join iiasa_inventory.inv_category c on ty.category_id = c.id
                                  join iiasa_inventory.inv_device_2_barcode b on b.device_id = d.id
                                  join iiasa_inventory.inv_barcodes bc on b.barcode_id = bc.id
                                  join iiasa_inventory.inv_status s on d.status = s.id
                                  join iiasa_inventory.inv_brand br on ty.brand_id = br.id
                                  left join iiasa_inventory.inv_supplier su on su.id = d.supplier_id
                                  left join iiasa_inventory.inv_supplier sup on sup.id = d.maintenance_with
                                  left join (select distinct device_id from iiasa_inventory.inv_device_2_persons_cc where active = 1) dp on dp.device_id = d.id 

答案 1 :(得分:1)

这是因为您没有在dp中选择active列。

select * from iiasa_inventory.inv_device    d                         
  join iiasa_inventory.inv_type ty on d.type_id = ty.id
  join iiasa_inventory.inv_category c on ty.category_id = c.id
  join iiasa_inventory.inv_device_2_barcode b on b.device_id = d.id
  join iiasa_inventory.inv_barcodes bc on b.barcode_id = bc.id
  join iiasa_inventory.inv_status s on d.status = s.id
  join iiasa_inventory.inv_brand br on ty.brand_id = br.id
  left join iiasa_inventory.inv_supplier su on su.id = d.supplier_id
  left join iiasa_inventory.inv_supplier sup on sup.id = d.maintenance_with
  left join (select distinct device_id,active from iiasa_inventory.inv_device_2_persons_cc) dp on dp.device_id = d.id 
where dp.active = 1

OR 您只需从子查询本身进行过滤即可。像:

left join (select distinct device_id 
        from iiasa_inventory.inv_device_2_persons_cc 
        where active=1) dp on dp.device_id = d.id