检查SQL有向图中的双向性

时间:2014-05-01 21:33:50

标签: sql firebird directed-graph

在我的Firebird数据库中,我有两个表,在第一个(LOCATIONS)中我保留了一些位置的信息(比如在RPG游戏中),这很简单,看起来像这样:

  

NAME
  位置1
  位置2
  位置3
  位置4
  地点5

和第二个表(CONNECTIONS)连接这些位置,所以我知道我可以从哪个位置去。情况是每一行只在一个方向连接两个位置,所以如果我想创建双向连接,我必须在CONNECTIONS表中插入两行。

一些示例连接:

first_location|second_location
  Location 1  |  Location 2 
  Location 1  |  Location 3
  Location 2  |  Location 1
  Location 2  |  Location 4
  Location 3  |  Location 1
  Location 3  |  Location 4
  Location 4  |  Location 5
  Location 5  |  Location 1

如您所见,这些连接是某些有向图的表示。

我需要创建一个SQL查询,它将显示我可以从给定的loc / node获取的所有位置(图形节点),此外,我是否可以返回上一个节点。 第一部分很简单,因为

select second_location 
from connections 
where connections.first_location = 'Location 1'

为我提供了连接到位置1的所有节点,但是当我尝试获取有关此连接的双向性的信息时,问题就开始了。

到目前为止,我尝试过这样的事情:

select c.first_location as first, c.second_location as second, p.count
from connections as c
where c.first = 'Location 1' 
inner join (
    select count(*) 
    from connections 
    where connections.first_location = c.second 
    and connections.second_location = 'Location 1'
) as p

我希望得到这样的结果:

   first   |   second   | count
Location 1 | Location 2 |   1
Location 1 | Location 3 |   0

但我错了。我该怎么做才能解决这个问题?

2 个答案:

答案 0 :(得分:2)

最初发布在TS的问题中:

我不再需要帮助,不知怎的,我在发布这个问题后立即解决了这个问题。

SELECT p.first_location, p.second_location, (
    SELECT COUNT (*)
    FROM (
        SELECT q.first_location, q.second_location 
        FROM connections AS c 
        WHERE p.first_location = q.second_location 
        and p.second_location = q.forst_location
    ) 
)
FROM connections AS p 
WHERE p.first_location = 'Location 1'

答案 1 :(得分:0)

你可以通过自我加入来解决这个问题:

SELECT fwd.first, fwd.second, bck.first IS NOT NULL returnable
  FROM connections fwd LEFT JOIN connections bck
    ON (fwd.first=bck.second AND fwd.second=bck.first)

http://sqlfiddle.com/#!12/ec191/13/0