如何在Postgresql中的SELECT语句中创建“即时”映射表

如何在Postgresql中的SELECT语句中创建“即时”映射表,第1张

概述我正在创建一个组合两个表,区域和输出的select语句, 基于引用的设备表和zone_number到output_type_id的映射. zone_number到output_type_id的映射不显示 数据库中的任何地方,我想在选择中“即时”创建它 声明.以下是我的架构: CREATE TABLE output_type ( id INTEGER NOT NULL, name 我正在创建一个组合两个表,区域和输出的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.对于这个例子:

zone_number | output_type_ID----------------------------1           | 1012           | 2023           | 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 zoneJOIN output ON output.device_ID = zone.device_IDJOIN zone_output_type_map mapON map.zone_number = zone.zone_numberAND map.output_type_ID = output.output_type_IDAND zone.device_ID = 1

然而,我正在寻找一种方法来创建区域分类器的输出映射
类型,而不创建一个新的表,而不是拼凑在一起的AND / OR
声明.有没有一种优雅的方法来创建两个字段之间的映射
在选择语句中?就像是:

SELECT zone.*,output.enabled FROM zoneJOIN output ON output.device_ID = zone.device_IDJOIN (    SELECT (        1 => 101,2 => 202,3 => 303,4 => 404    ) (zone_number,output_type_ID)) as mapON map.zone_number = zone.zone_numberAND map.output_type_ID = output.output_type_IDAND zone.device_ID = 1

免责声明:我知道,在该区域内,启用的域将会被理解
表.但是,我无法控制那件事.我只是在寻找
最优雅的解决方案来自应用端.谢谢!

您可以使用VALUES作为内联表并加入JOIN,您只需要给它一个别名和列名:
join (values (1,304)) as map(zone_number,output_type_ID)on ...

从fine manual:

VALUES can also be used where a sub-SELECT might be written,for
example in a FROM clause:

06001

总结

以上是内存溢出为你收集整理的如何在Postgresql中的SELECT语句中创建“即时”映射表全部内容,希望文章能够帮你解决如何在Postgresql中的SELECT语句中创建“即时”映射表所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1170355.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存