سؤال

ولدي جدول في قاعدة البيانات الذي يقوم بتخزين بنية شجرة. وفيما يلي المجالات ذات الصلة:

mytree (id, parentid, otherfields...)

وأريد أن أجد كافة العقد ورقة (أي، أي سجل الذي id ليس parentid سجل آخر)

ولقد حاول هذا:

SELECT * FROM mytree WHERE `id` NOT IN (SELECT DISTINCT `parentid` FROM `mytree`)

ولكن هذا إرجاع مجموعة فارغة. الغريب، وإزالة "NOT" إرجاع مجموعة من كافة العقد غير طرفية.

ويمكن لأي شخص رؤية أين أنا ذاهب خاطئة؟

تحديث: شكرا لاهل الإجابات، وأنهم جميعا كانت الصحيح وعملت بالنسبة لي. لقد قبلت دانيال لأنه يفسر أيضا لماذا الاستعلام بلدي لم تنجح (الشيء NULL).

هل كانت مفيدة؟

المحلول

ولم الاستعلام الخاص بك لا يعمل بسبب الاستعلام الفرعي يتضمن NULL. تعديل طفيف التالية يعمل بالنسبة لي:

SELECT * FROM `mytree` WHERE `id` NOT IN (
    SELECT DISTINCT `parentid` FROM `mytree` WHERE `parentid` IS NOT NULL)

نصائح أخرى

ولا فكرة لماذا طلبك لم تنجح. وهنا يكمن شيء مماثل في الخارجية اليسرى انضمام جملة - تحاول ذلك بهذه الطريقة

select a.*
from mytree a left outer join
     mytree b on a.id = b.parentid
where b.parentid is null
SELECT * FROM mytree AS t1
LEFT JOIN mytree AS t2 ON t1.id=t2.parentid
WHERE t2.parentid IS NULL

وحدد * من mytree حيث معرف ليس في (تحديد parentid متميزة من حيث mytree parentid IS NOT NULL)

http://archives.postgresql.org/pgsql-sql /2005-10/msg00228.php

وبلدي بنية الجدول هو

memberid    MemberID    joiningposition packagetype
RPM00000    NULL          Root                free
RPM71572    RPM00000       Left           Royal
RPM323768   RPM00000       Right              Royal
RPM715790   RPM71572       Left            free
RPM323769   RPM71572      Right            free
RPM715987   RPM323768      Left             free
RPM323985   RPM323768      Right               free
RPM733333   RPM323985     Right            free
RPM324444   RPM715987     *emphasized text*Right               Royal

-

ALTER procedure [dbo].[sunnypro]
as
DECLARE @pId varchar(40) = 'RPM00000';
Declare @Id int
set @Id=(select id from registration where childid=@pId) 
begin




-- Recursive CTE
    WITH R AS
     (



SELECT 

    BU.DateofJoing,
    BU.childid,
    BU.joiningposition,
    BU.packagetype
    FROM registration AS BU
    WHERE
    BU.MemberID = @pId and
   BU.joiningposition IN ('Left', 'Right')
    or BU.packagetype in('Royal','Platinum','Majestic')
     and BU.Id>@id
    UNION All

-- Recursive part
SELECT

     BU.DateofJoing,
     BU.childid,
     R.joiningposition,
    BU.packagetype


    FROM R
    JOIN registration AS BU
    ON BU.MemberID = R.childid
    WHERE
    BU.joiningposition IN ('Left', 'Right') and
  BU.packagetype in('Royal','Platinum','Majestic')
 and BU.Id>@id
)

INSERT INTO Wallatpayout
       (childid
       ,packagetype

       ,joiningposition
       ,DateofJoing
       ,Total)

-- Final groups of nodes found
SELECT top 3

R.childid,
R.packagetype,
R.joiningposition,
R.DateofJoing,
Total = COUNT_BIG(*)
FROM R where R.packagetype in('Royal','Platinum','Majestic')
GROUP BY R.childid,
R.joiningposition,
R.DateofJoing,
R.packagetype
OPTION (MAXRECURSION 0);
end
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top