PostgreSQL选择查询不起作用

时间:2015-12-21 18:14:04

标签: sql postgresql select

我有3张桌子:

CREATE table materials
 (id serial primary key not null,
 name varchar(50) not null,
 unit varchar(10) not null default 'шт',
 price decimal(12, 2) not null check (price>0));

CREATE table warehouses 
(id serial primary key not null,
 lastname varchar(25) not null);

CREATE table materials_in_warehouses
 (id_warehouses integer references warehouses(id) on update cascade on delete cascade,
 id_materials integer references materials(id),
 unit varchar(15) default 'шт',
 count integer not null CHECK (count>0),
 lastdate date not null, 
primary key (id_warehouses, id_materials);

我需要为每种材料选择:名称;仓库的数量,其中材料的存在量> 100。

我试着这样做:

select materials.name, count(select * from materials_in_warehouses where 
materials.id = materials_in_warehouses.id_materials AND material_in_warehouses.count > 100) as sount from  materials;

但当然,这种废话无法奏效。

提前谢谢。

3 个答案:

答案 0 :(得分:1)

非常直接。

SELECT m.name, count(miw.id_warehouses)
FROM materials m
LEFT JOIN materials_in_warehouses miw ON m.id=miw.id_materials AND miw."count">100
GROUP BY m.id, m.name

你的错误可能就是你使用count作为列名,而它是一个聚合函数。在PostgreSql中使用双引号: Escaping keyword-like column names in Postgres

答案 1 :(得分:0)

试试这个

select materials.name, count(
select id_warehouses from materials_in_warehouses join materials 
on  materials.id = materials_in_warehouses.id_materials
where material_in_warehouses.count > 100
) as sount from  materials;

答案 2 :(得分:0)

SELECT m.name, COUNT(w.id) AS locs
  FROM materials m, warehouses w, materials_in_warehouses mw
  WHERE m.id = mw.id_materials
    AND w.id = mw.id_warehouses
    AND mw.count > 100
  GROUP BY m.name;

如果有效,我会回来解释我是如何想出来的。