我有一张基本上看起来像这样的表:
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错误)(将帮助您调试)以及使用参数化语句而不是将动态值替换为查询本身的示例(强烈建议):