当前位置: 首页 > 面试题库 >

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

符畅
2023-03-14
问题内容

我创建结合两个表的SELECT语句,zoneoutput的基础上,参照device表,并在一个映射zone_numberoutput_type_id。映射zone_numberoutput_type_id未在数据库中的任何地方出现,我想创建“关于即时”的SELECT语句中。以下是我的架构

CREATE TABLE output_type (
    id INTEGER NOT NULL, 
    name TEXT,
    PRIMARY KEY (id)
);

CREATE TABLE device (
    id INTEGER NOT NULL,
    name TEXT,
    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,
    device_id INTEGER NOT NULL REFERENCES device(id),
    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),
(1, 3),
(1, 4);

INSERT INTO output (device_id, output_type_id, enabled) VALUES 
(1, 101, TRUE),
(1, 202, FALSE),
(1, 303, FALSE), 
(1, 404, TRUE);

我需要enabled从输出表中获取给定设备每个区域的关联字段。每个zone_number映射到一个output_type_id。对于此示例:

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获取enabled设备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

但是,我正在寻找一种创建区域编号到输出类型的映射的方法,而无需创建新表并且不将AND /
OR语句拼凑在一起。是否有一种优雅的方法在select语句中的两个字段之间创建映射?就像是:

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

免责声明:我知道理想情况下该enabled字段将存在于zone 表中。但是,我对此没有控制权。我只是在寻找应用程序方面最优雅的解决方案。谢谢!


问题答案:

您可以将其VALUES用作内联表并加入其中,只需为其提供别名和列名即可:

join (values (1, 101), (2, 202), (3, 303), (4, 304)) as map(zone_number, output_type_id)
on ...

从精美的手册中:

VALUES也可以在SELECT可能写有FROM子句的地方使用,例如在子句中:

SELECT f.*
  FROM films f, (VALUES('MGM', 'Horror'), ('UA', 'Sci-Fi')) AS t

(studio, kind)
WHERE f.studio = t.studio AND f.kind = t.kind;

UPDATE employees SET salary = salary * v.increase
  FROM (VALUES(1, 200000, 1.2), (2, 400000, 1.4)) AS v (depno, target,

increase)
WHERE employees.depno = v.depno AND employees.sales >= v.target;



 类似资料:
  • 问题内容: 我有3张桌子。团队,选项,选项团队。 团队拥有一个TeamId,名称 拥有Option拥有OptionId,OptionGroup OptionTeam拥有TeamId,OptionId,OptionGroup 我想获得一个团队列表,以及额外的列,这些列指示每个组有多少个选项连接到每个团队。这是通过上面的查询完成的,但是我想用表Option中的OptionGroup值替换4,5,6,1

  • 我的Postgres版本:“PostgreSQL 9.4.1,由Visual C++build 1800编译,32位” 我要处理的桌子;包含列 EventTime-Timestamp不带时区 SerialNumber-可变字符(32) sourceid-integer 和其他4列 下面是我的select语句

  • 问题内容: 我正在开发Web应用程序。我们在项目中将Hibernate用作ORM。实际上,我们的应用程序根据用户选择动态创建一些表。用户可以选择表名,列名,然后可以从csv文件导入数据。所以我的问题是:如何用Hibernate和Java对象映射此动态创建的表? 问题答案: 它可以动态完成,但有些混乱: 在建立SessionFactory之前,您需要动态更改Hibernate的Configurati

  • 问题内容: 是否可以通过select语句创建一个临时(仅会话)表,而无需使用create table语句并指定每个列类型?我知道派生表可以做到这一点,但是它们是超临时的(仅用于陈述),我想重用。 如果我不必编写create table命令并保持列列表和类型列表匹配,则可以节省时间。 问题答案: 从位于http://dev.mysql.com/doc/refman/5.7/en/create- ta

  • 问题内容: 在C语言中非常常见:像这样入侵“空if语句”: 它在Python中工作吗?我的意思是,我们可以通过使用它来提高应用程序的性能吗?我也想知道为什么。 问题答案: 如果“ if”中没有其他情况,则性能会得到改善,因为字节码不会将执行传递给“ if”情况。 这是一些功能和输出 以下示例应用程序: 分解为: 以下 分解为: