我創建結合兩個表,zone
和output
, 根據引用device
表上的映射的select語句zone_number
至output_type_id
。 zone_number
到output_type_id
的映射在數據庫中的任何位置都沒有出現 ,我想在選擇 語句中「on-the-fly」創建它。下面是我的架構:如何在SELECT語句中創建一個「上即時」映射表在PostgreSQL
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
。在這個例子中:處理映射是創建一個新的表
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
zone_number | output_type_id
----------------------------
1 | 101
2 | 202
3 | 303
4 | 404
的一種方式:
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
不過,我正在尋找一種方式來創建區域nunbers的輸出映射不 類型創建一個新表並沒有拼湊一堆A的ND/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
表中。但是,我無法控制這件作品。我只是從應用程序方面尋找最優雅的解決方案 。謝謝!
也許您可以使用VIEW? –
對此我會好的,但底層映射仍然需要在select語句內(視圖內)定義,這就是我爲之分解的地方。似乎應該有一個簡單的方法來創建一個可以在select語句中使用的鍵/值「散列」來加入這兩個表。 – Divey
您的'output_type'示例數據與您的輸出不匹配。 output_type_id',第一次使用101,102,103和104,而第二次使用101,202,303和404;萬歲的FKs指出這對我:) –