2

私の状況:

Table A
(
ID
Parent_Id
TimeStamp
)

ルートにはParent_Idnullがあり、子にはその父親のIdがあります。

私は単純に、すべての表Aの最後のすべての子を取得したいと思っています。私が望まない父と子。(最後のものを除く)。

これを取得するためのSQLを構築することは可能ですか?

PS:私はどこでもSQLを使用しています。11。おそらく、ansi sqlでこれを解決できるかもしれませんが、よくわかりません。

編集:(追加の詳細を提供するために編集)要素の最後の子は必要ありません。

例:

Id1親NULL

Id2親1

Id 3(最後の子)親1

ID4親NULL

Id 5(最後の子)親4

取得したい:Id 3 Id 5

4

4 に答える 4

4

ストアド関数の使用

create function LastChild(in parent integer)
returns integer
begin
    declare res integer;  
    select top 1 id into res from TableA where parent_id = parent order by timeCol desc;
    return res;
end

選択する

select Id, lastchild(id) from TAbleA where parent_id is null

ストアド関数を使用せずに別のソリューションに取り組みます。

編集:ストアド関数なし:

select Id, (select top 1 id from TableA childs where parent_id = TableA.id order by timeCol desc) from TableA where parent_id = 0
于 2009-11-20T19:15:43.803 に答える
3

「最後の子」とは、それ自体に子がないアイテム(および多くの場合リーフレベルのアイテムと呼ばれる)を意味する場合、次のようになります。

SELECT ID
 from A
 where ID not in (select Parent_Id from A)

相関サブクエリのバージョンは理解するのが少し難しいですが、大きなテーブルではより高速に動作します。

SELECT ID
 from A OuterReference
 where not exists (select 1 from A where Parenti_ID = OuterReference.ID)

(「OuterReference」はテーブルAのエイリアスです)

私はSQLServerを使用していますが、これはかなり基本的な構文であり、最小限の変更で機能するはずです。

于 2009-11-20T18:46:52.383 に答える
0
select * from a where id not in (select parent_id from table a)

つまり、アイテムのIDが他のアイテムの親IDではないテーブルaからすべてを選択します。これにより、グラフのすべてのリーフノードが得られます。

編集:
あなたの編集は少し紛らわしいです、そしてIDは通常順序付けメカニズムとして使用されません、しかしそれにもかかわらず、あなたが与える例はこのクエリによって達成することができます

SELECT MAX( id )
FROM a
WHERE id NOT IN
  (SELECT parent_id
      FROM a
      WHERE parent_id IS NOT NULL
  )
GROUP BY parent_id
于 2009-11-20T18:46:45.657 に答える
0

Postgres 9.4の場合、子カテゴリのみを取得するためにクエリを少し更新する必要がありました

select count(id) from A as outer_ref where not exists(
    select 1 from A where parent_id=outer_ref.id) and parent_id is not null;
于 2021-05-04T10:38:14.737 に答える