当前位置: 首页 > 面试题库 >

在一个SQL查询中遍历“ inked list”?

万俟铭
2023-03-14
问题内容

我有一张基本上看起来像这样的表:

id | redirectid | data

其中redirectid是另一行的ID。基本上,如果选择了一行,并且该行具有一个redirectid,则应该在该位置使用redirectid数据。可能有多个重定向,直到redirectid为NULL为止。本质上,这些重定向在表中形成一个链接列表。我想知道的是,给定一个ID,是否可以设置一个将遍历所有可能的重定向并在“列表”末尾返回ID的sql查询?

这使用的是Postgresql 8.3,如果可能,我想在sql查询中进行所有操作(而不是在我的代码中进行迭代)。


问题答案:

PostgreSQL是否支持使用WITH子句的递归查询?如果是这样,类似的事情可能会起作用。(如果需要测试答案,请在问题中提供一些CREATE
TABLE和INSERT语句,以及在INSERT中获得示例数据所需的结果。)

with Links(id,link,data) as (
  select
    id, redirectid, data
  from T
  where redirectid is null
  union all
  select
    id, redirectid, null
  from T
  where redirectid is not null
  union all
  select
    Links.id,
    T.redirectid,
    case when T.redirectid is null then T.data else null end
  from T
  join Links
  on Links.link = T.id
)
  select id, data
  from Links
  where data is not null;

附加说明:

:(您可以根据WITH表达式自己实现递归。我不知道用于顺序编程的postgresql语法,所以这有点伪:

将查询结果插入到名为Links的新表中:

select
    id, redirectid as link, data, 0 as depth
  from T
  where redirectid is null
  union all
  select
    id, redirectid, null, 0
  from T
  where redirectid is not null

还声明一个整数:: depth并将其初始化为零。然后重复以下操作,直到不再向“链接”添加行。链接将包含您的结果。

  increment ::depth;
  insert into Links
  select
    Links.id,
    T.redirectid,
    case when T.redirectid is null then T.data else null end,
    depth + 1
  from T join Links
  on Links.link = T.id
  where depth = ::depth-1;
end;

我认为这将比任何游标解决方案都更好。实际上,我根本无法想到游标对这个问题有多大帮助。

请注意,如果有任何循环(重定向最终是循环的),则此操作不会终止。



 类似资料:
  • 问题内容: 在注意到Django的某些内置查询效率低下之后,一直在编写一些原始SQL查询。我试图遍历结果并将其分组(我知道模板标签,这对我不起作用- 我需要能够独立访问单独的组)。这是我的代码: 这给了我我想要的东西(例如,我可以访问的列表),但是它为每次迭代运行一个数据库查询以获取字段。我尝试在循环之前添加,没有效果。 有人可以帮我从这里出去吗?这似乎应该很简单。 谢谢,马特 问题答案: 编辑:

  • 问题内容: 这是我在phpi中使用mysqli面向对象样式的简单查询: 这很好。我获得了从select语句检索的名称列表。 现在,在一段时间内,我想将该变量用作另一个查询的参数,但是mysqli不允许这样做,因为我必须关闭第一个查询,然后调用第二个查询。 因此,我认为我必须存储第一个查询的结果,然后遍历结果以调用新查询。 我尝试了以下方法: 但这是行不通的。永远不会到达while内的代码。 注意

  • 问题内容: 所以我有2张桌子,和。 具有列,具有呼叫者的ID和进行呼叫的时间。然后,我有另一台已,,,,,有一个人,他们的位置的ID ,而且它们在该位置的时间。 我想写一个看起来像这样的查询: 基本上,这是在寻找给定值的最接近值。之后,最终,我想根据数据查找呼叫的位置。 我该怎么做?我知道有一种基于集合的方法,但是我不想那样做。我调查了一下,但是我感到在那方面的表现很糟糕……所以循环中是否有这样做

  • 问题内容: 我不太确定自己是在说这种权利,但请耐心等待。 我想知道是否有可能在SQL(特别是MySQL)中做这样的事情:假设我们有树状数据保存在下表中的数据库中: 因此,除“根”行外,每一行都有一个父级,而叶行除外,每一行都有子级。 是否可以仅使用SQL查找任何给定行的所有后代? 问题答案: 可以仅使用SQL而不是在单个查询中获取所有后代。但是我敢肯定,你知道了。我假设您的意思是您想在单个查询中执

  • 问题内容: 假设我有两个表,并且 我想在一个查询中将来自某些输入的数据插入到表中,该怎么做? 请,如果可以做到,请解释语法。 问题答案: MySQL不支持在单个INSERT语句中进行多表插入。奇怪的是,Oracle是我所知道的唯一一个…

  • 问题内容: 我正在慢慢地将所有功能从一个功能移到另一个功能,并且遇到了第一个障碍。我不知道如何通过参数遍历结果。我对以下内容满意: 但是,如果我想做这样的事情: 显然,“其他”是动态的。 问题答案: 这是一个使用PDO连接到数据库,告诉它引发Exception(而不是php错误)(将帮助您调试)以及使用参数化语句而不是将动态值替换为查询本身的示例(强烈建议):