我有一張桌子paths:
CREATE TABLE paths (
id_travel INT,
point INT,
visited INT
);
示例行:
id_travel | point | visited
----------- ------- ---------
10 | 35 | 0
10 | 16 | 1
10 | 93 | 2
5 | 15 | 0
5 | 26 | 1
5 | 193 | 2
5 | 31 | 3
還有一張桌子distances:
CREATE TABLE distances (
id_port1 INT,
id_port2 INT,
distance INT CHECK (distance > 0),
PRIMARY KEY (id_port1, id_port2)
);
我需要提出一個觀點:
id_travel | point1 | point2 | distance
----------- -------- -------- ---------
10 | 35 | 16 | 1568
10 | 16 | 93 | 987
5 | 15 | 26 | 251
5 | 26 | 193 | 87
5 | 193 | 31 | 356
我不知道如何在dist_trips這里通過遞回請求:
CREATE VIEW dist_view AS
WITH RECURSIVE dist_trips (id_travel, point1, point2) AS
(SELECT ????)
SELECT dt.id_travel, dt.point1, dt.point2, d.distance
FROM dist_trips dt
NATURAL JOIN distances d;
dist_trips是一個遞回請求女巫,應該回傳三列:id_travel、point1和point2from table paths。
uj5u.com熱心網友回復:
你不需要遞回。可以是普通連接:
SELECT id_travel, p1.point AS point1, p2.point AS point2, d.distance
FROM paths p1
JOIN paths p2 USING (id_travel)
LEFT JOIN distances d ON d.id_port1 = p1.point
AND d.id_port2 = p2.point
WHERE p2.visited = p1.visited 1
ORDER BY id_travel, p1.visited;
db<>在這里擺弄
你的路徑似乎有無間隙的遞增數字。只需將每個點與下一個點連接起來。
我投入了 aLEFT JOIN以保留結果中每條路徑的所有邊緣,即使distances表不應該有匹配的條目。大概是慎重吧。
你NATURAL JOIN哪兒也沒去。通常,NATURAL很少有用并且容易損壞。手冊警告:
USING由于僅組合了列出的列,因此對于連接關系中的列更改是相當安全的。NATURAL風險要大得多,因為對任何一個關系的任何模式更改都會導致出現新的匹配列名,這將導致連接也合并該新列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/474923.html
標籤:sql PostgreSQL 递归 加入 递归查询
