2017-06-29 16 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的路线都是错误的,那些路线是无效的。现在加载一些数据来测试性能。 –