2017-06-29 76 views
1

我確實使用舊式表示法進行工作。如何使用三個表更新JOIN

DBFiddle

UPDATE 
    route_sources rs 
SET 
    has_route = false 
FROM avl a1, avl a2 
WHERE rs.avl_id_begin = a1.avl_id 
    AND rs.avl_id_end = a2.avl_id 
    AND 0 IN (a1.azimuth, a2.azimuth) 

但不知道是否可以使用顯式連接sintaxis來寫:

UPDATE 
    route_sources rs 
SET 
    has_route = false 
FROM avl a1 
JOIN avl a2 
    ON rs.avl_id_end = a2.avl_id <= this doesnt work 
WHERE rs.avl_id_begin = a1.avl_id 
    AND 0 IN (a1.azimuth, a2.azimuth) 

ERROR: referencia a la entrada de la cláusula FROM para la tabla «rs» no válida
LINE 10: ON rs.avl_id_end = a2.avl_id
^
HINT: Hay una entrada para la tabla «rs», pero no puede ser referenciada desde esta parte de la consulta.

轉換爲類似。

參考rsFROM clausule無效。提示:有一個條目rs,但無法在查詢的這一部分參考。

也嘗試使用全名而不是別名,但都沒有工作。

+0

請使用http://www.rextester.com準備的樣本數據。如何在cte中進行連接(3個表格),然後使用目標表格和cte進行更新? – lad2025

+0

@ lad2025 Rexter心不是我的工作,我想補充dbFiddle代替 –

+0

'WITH AS CTE( SELECT rs.route_source_id FROM route_sources RS JOIN AVL A1 ON rs.avl_id_begin = a1.avl_id JOIN AVL A2 ON rs.avl_id_end = a2.avl_id WHERE 0 IN(a1.azimuth,a2.azimuth) ) UPDATE route_sources室溫 SET has_route =假 FROM CTEç WHERE c.route_source_id = rt.route_source_id' – lad2025

回答

0

一種方法是使用子查詢/ CTE來選擇行,然後加入到目標表:

WITH cte AS ( 
    SELECT rs.route_source_id 
    FROM route_sources rs 
    JOIN avl a1 ON rs.avl_id_begin = a1.avl_id 
    JOIN avl a2 ON rs.avl_id_end = a2.avl_id 
    WHERE 0 IN (a1.azimuth, a2.azimuth) 
) 
UPDATE route_sources rt 
SET has_route = false 
FROM cte c 
WHERE c.route_source_id = rt.route_source_id; 

或:

UPDATE route_sources rt 
SET has_route = false 
FROM (SELECT rs.route_source_id 
     FROM route_sources rs 
     JOIN avl a1 ON rs.avl_id_begin = a1.avl_id 
     JOIN avl a2 ON rs.avl_id_end = a2.avl_id 
     WHERE 0 IN (a1.azimuth, a2.azimuth)) s 
WHERE s.route_source_id = rt.route_source_id; 

LiveDemo

0

的一點是a1和a2沒有關聯(僅通過rs) 這可能更簡單(也更快)。它也將避免多個更新到同一行。


UPDATE route_sources rs 
SET has_route = false 
WHERE EXISTS(SELECT* FROM avl a1 
     WHERE a1.avl_id= rs.avl_id_begin 
     AND a1.azimuth =0 
     ) 
OR EXISTS (SELECT* FROM avl a2 
     WHERE a2.avl_id = rs.avl_id_end 
     AND a2.azimuth= 0 
     ); 
+0

也許我的描述不清楚,但想法是'avl'可以是一個路線的開始或結束,並且都在'avl'表中。但我會試試這個。 –

+0

我的結論是:你要麼avl_id_begin或avl_id_end引用azimuth = 0的avl -record。 (或兩者) – wildplasser

+0

是的,我知道當gps沒有衛星定位時,方位角默認是0,所以大多數方位角0的路線都是錯誤的,那些路線是無效的。現在加載一些數據來測試性能。 –