使用一些复杂的关系为3个表创建视图

时间:2016-07-25 18:50:38

标签: sql postgresql

所以我有3张桌子," ruta"," track_ruta"," punto_ruta" ruta与track_ruta有一对多的关系,与punto_ruta有一对多的关系。 track_ruta还与punto_ruta有一对多的关系。 ruta意味着顺便说一下西班牙语的路线。长话短说,一条路线有轨道,轨道有点。可以存在没有属于路线的轨道的点。这就是它的原因。 我需要根据点上的日期检索并进行搜索,我需要查找路线的点。 我把它作为一个sql语句

select DISTINCT p.* 
from PuntoRuta p, Ruta r, TrackRuta t 
where ((r.codigo=ROUTEID
      AND t.ruta.codigo=r.codigo AND p.trackRuta.codigo=t.codigo) 
      OR   p.ruta=ROUTEID)

ROUTEID正在替换我的代码上的ID

这很有用。我不喜欢使用DISTINCT我知道这是昂贵的,它一直有用。在用户在他的路线上有百万分之前,即使我使用限制也需要搜索。 我不需要处理复杂的数据库关系,所以我真的很生疏。

我对如何将其转换为视图非常模糊。我正在使用JOINS来做这个

SELECT *
FROM punto_ruta AS p 
JOIN track_ruta AS t
ON p.id_track_ruta=t.id_track_ruta
JOIN ruta r
ON r.id_ruta=t.id_ruta
right OUTER JOIN ruta r1
ON r1.id_ruta=p.id_ruta

我也尝试了FULL OUTER JOIN,但在这两种情况下,它只是在最后添加我的所有路线。我无法添加仅属于路线而不属于轨道的点。

我应该合并2个查询吗?喜欢添加这个

SELECT p.*
FROM punto_ruta AS p
JOIN ruta AS r
On r.id_ruta=p.id_ruta

以前的查询?

1 个答案:

答案 0 :(得分:2)

让独立点在null

中有track_id
r(id, ...)
t(id, r_id, ...)
p(id, r_id, t_id, ...)

select p.*
  from p
  where p.r_id = ROUTEID
    and p.t_id is null
union all
select p.*
  from t left join p on t.id = p.t_id
  where t.r_id = ROUTEID