Sql 使用基于子查询的列选择语句(postgres)

Sql 使用基于子查询的列选择语句(postgres),sql,postgresql,join,Sql,Postgresql,Join,根据使用Postgres 9.3的子查询结果选择列的最优雅的方法是什么,即可读性和易于维护的方法 以下是一些示例数据: create temporary table if not exists food ( id serial primary key, pet_id varchar, steak integer, chicken integer, fish integer, veg integer ); insert into food (pet_id, steak, chicken, fis

根据使用Postgres 9.3的子查询结果选择列的最优雅的方法是什么,即可读性和易于维护的方法

以下是一些示例数据:

create temporary table if not exists food (
id serial primary key,
pet_id varchar,
steak integer,
chicken integer,
fish integer,
veg integer
);

insert into food (pet_id, steak, chicken, fish, veg) values
(1, 100, 10, 1, 78),
(2, 140, 100, 1100, 7),
(3, 10, 10, 10, 7);

create temporary table if not exists foodtypes (
id serial primary key,
name varchar,
meat boolean
);

insert into foodtypes (name, meat) values
('steak', true),
('chicken', true),
('fish', true),
('veg', false);
我希望能够为数据库中的所有宠物生成一些输出,包括所有有肉的列。目前,我正在使用:

从食物中选择id、宠物id、牛排、鸡肉、鱼

但是,如果另一家宠物店的经营者将新的肉类食品类型添加到foodtypes表中,会发生什么情况?它不会包括在结果中

理想情况下,为了可维护性和一致性,我希望能够基于子查询选择我的列—类似于:

选择名称,从食物类型中选择不同的名称,其中meat=true from food


这不管用。我已经读到横向连接可能有用,但我不确定它将如何帮助实现这一点。

我认为最合适的处理方法是改变餐桌的形式

这样,您就可以对food.foodtype和foodtypes.name列进行常规联接。这将证明您的查询是可靠的,因为任何新的食品类型都会自动处理

建议的表格设置

推荐查询


您可以使用一个推荐设置的示例

这些表只是很小的示例,我无法在生产中更改实际的模式。不用说,实际的问题并不涉及宠物店。我明白了,我会看看是否还有其他我能想到的。谢谢,这是一份来自广泛模式的报告。我希望能够在临时表中存储和重用列。我编了一个例子,试图说明最简单的情况。当然,我仍然有可能问错了问题
    id  pet_id  steak   chicken fish
0   1   1       100     10      1
1   2   2       140     100     1100
2   3   3       10       10     10
3   7   1       100     10      1
4   8   2       140     100     1100
5   9   3       10       10     10
create table food (
id serial primary key,
pet_id varchar,
foodtype varchar, 
amount int
);
create table food (
id serial primary key,
pet_id varchar,
foodtype varchar, 
amount int
);

insert into food (pet_id, foodtype, amount) values
(1, 'steak', 100),
(1, 'chicken', 10),
(1, 'fish', 1),
(1, 'veg', 78),
(2, 'steak', 140),
(2, 'chicken', 100),
(2, 'fish', 1100),
(2, 'veg', 7),
(3, 'steak', 10),
(3, 'chicken', 10),
(3, 'fish', 10),
(3, 'veg', 7);

create table foodtypes (
id serial primary key,
name varchar,
meat boolean
);

insert into foodtypes (name, meat) values
('steak', true),
('chicken', true),
('fish', true),
('veg', false);
select * 
from food f 
join foodtypes ft on 
    f.foodtype = ft.name
where ft.meat = true