如何在Postgresql中的SELECT语句中创建“即时”映射表
发布时间:2020-12-13 16:33:08 所属栏目:百科 来源:网络整理
导读:我正在创建一个组合两个表,区域和输出的select语句, 基于引用的设备表和zone_number到output_type_id的映射. zone_number到output_type_id的映射不显示 数据库中的任何地方,我想在选择中“即时”创建它 声明.以下是我的架构: CREATE TABLE output_type ( id
我正在创建一个组合两个表,区域和输出的select语句,
基于引用的设备表和zone_number到output_type_id的映射. zone_number到output_type_id的映射不显示 数据库中的任何地方,我想在选择中“即时”创建它 声明.以下是我的架构: CREATE TABLE output_type ( id INTEGER NOT NULL,name TEXT,PRIMARY KEY (id) ); CREATE TABLE device ( id INTEGER NOT NULL,PRIMARY KEY (id) ); CREATE TABLE zone ( id SERIAL NOT NULL,device_id INTEGER NOT NULL REFERENCES device(id),zone_number INTEGER NOT NULL,PRIMARY KEY (id),UNIQUE (zone_number) ); CREATE TABLE output ( id SERIAL NOT NULL,output_type_id INTEGER NOT NULL REFERENCES output_type(id),enabled BOOLEAN NOT NULL,PRIMARY KEY (id) ); 这里有一些示例数据: INSERT INTO output_type (id,name) VALUES (101,'Output 1'),(202,'Output 2'),(303,'Output 3'),(404,'Output 4'); INSERT INTO device (id,name) VALUES (1,'Test Device'); INSERT INTO zone (device_id,zone_number) VALUES (1,1),(1,2),3),4); INSERT INTO output (device_id,output_type_id,enabled) VALUES (1,101,TRUE),202,FALSE),303,404,TRUE); 我需要从给定设备的每个区域的输出表中获取关联的已启用字段. zone_number | output_type_id ---------------------------- 1 | 101 2 | 202 3 | 303 4 | 404 处理映射的一种方法是创建一个新表 CREATE TABLE zone_output_type_map ( zone_number INTEGER,output_type_id INTEGER NOT NULL REFERENCES output_type(id) ); INSERT INTO zone_output_type_map (zone_number,output_type_id) VALUES (1,101),(2,202),(3,303),(4,404); 并使用以下SQL获取设备1的所有区域以及启用的标志: SELECT zone.*,output.enabled FROM zone JOIN output ON output.device_id = zone.device_id JOIN zone_output_type_map map ON map.zone_number = zone.zone_number AND map.output_type_id = output.output_type_id AND zone.device_id = 1 然而,我正在寻找一种方法来创建区域分类器的输出映射 SELECT zone.*,output.enabled FROM zone JOIN output ON output.device_id = zone.device_id JOIN ( SELECT ( 1 => 101,2 => 202,3 => 303,4 => 404 ) (zone_number,output_type_id) ) as map ON map.zone_number = zone.zone_number AND map.output_type_id = output.output_type_id AND zone.device_id = 1 免责声明:我知道,在该区域内,启用的域将会被理解
您可以使用VALUES作为内联表并加入JOIN,您只需要给它一个别名和列名:
join (values (1,304)) as map(zone_number,output_type_id) on ... 从fine manual:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |