Как создать таблицу сопоставления «на лету» в инструкции SELECT в Postgresql

m создает оператор выбора, который объединяет две таблицы,zone а такжеoutputна основе ссылкиdevice стол и на карте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,
    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 Таблица. Тем не менее, я нене могу контролировать этот кусок. Я'Я просто ищу наиболее элегантное решение со стороны приложения. Спасибо!

Ответы на вопрос(3)

Ваш ответ на вопрос