4

「つながり」を作りたい

たとえば、5 つの投稿があります (id: "1"、id: "2"、id: "3"、id: "4"、id: "5")

そして彼らはシーケンスを持っています

{id:"1", nextId:"2"},
{id:"2", nextId:"4"} ,
{id:"3", nextId:"0"},
{id:"4", nextId :"3"},
{id:"5", nextId:"0"},

「1」から検索すると、「5」から検索すると、{id:"1"}、{id:"2"}、{id:"4"}、{id:"3"} という結果が得られました。 "、結果が得られました: {id:"5"}

ANSI SQL で {id:"1"} で始まるすべてを見つけるにはどうすればよいですか?

select s.id, s.nextId from sample s
join sample ns on ns.id = s.nextId

最初のノードからすべてを作成します。

「{some id}」を開始し、「limit 10」を使用したい

助けて!

4

4 に答える 4

2

私はHSQLDBを持っていませんが、次のようなものでうまくいくはずです。

WITH RECURSIVE chain(seq, me, next) AS (
  VALUES(0, CAST(null AS int), 1) -- start
  UNION ALL
  SELECT seq + 1, id, nextId
  FROM sample, chain
  WHERE id = next
)
SELECT * FROM chain WHERE seq > 0;
于 2012-10-18T09:27:58.310 に答える
2
create table links (id integer, nextid integer);

insert into links 
values 
(1, 2),
(2, 4),
(3, 0),
(4, 3),
(5, 0);

commit;

with recursive link_tree as (
   select id, nextid
   from links
   where id = 1  -- change this to change your starting node
   union all 
   select c.id, c.nextid
   from links c
     join link_tree p on p.nextid = c.id
)
select *
from link_tree;

これは ANSI SQL であり、HSQLDB、PostgreSQL、H2、Firebird、DB2、Microsoft SQL Server、Oracle 11.2、およびその他のいくつかのエンジン動作します。 )。

于 2012-10-18T09:48:23.973 に答える
0

再帰の問題は、他の回答によって明確に示されています。実装はRDBMSベンダー間で一貫していません。

または、再帰を完全に回避し、プラットフォームに依存しないSQL実装で簡単に構築できる「入れ子集合」モデルを使用することもできます。

于 2012-10-18T10:23:48.993 に答える
0

これはSQLサーバーで機能します。HSQLDBで役立つかもしれません

あなたの例では、1を通知すると返されます

2->4->3->0

最初に1を追加するか、最後から0を削除するかはあなた次第です

CREATE table test_sequence(
id int,
next_id int
)

insert into test_sequence VALUES(1,2)
insert into test_sequence VALUES(2,4)
insert into test_sequence VALUES(3,0)
insert into test_sequence VALUES(4,3)
insert into test_sequence VALUES(5,0)



alter function selectSequence(@id int)
returns varchar(max)
begin
    declare @next varchar(max)
    select @next=next_id from test_sequence WHERE id =@id
    if (@next != '') begin
        return @next +'->'+ dbo.selectSequence(@next)
    end else begin
        select @next=''
    end
    return @next
end

select dbo.selectSequence(1)
于 2012-10-18T09:33:27.533 に答える