0

親カテゴリを見つけようとしています。

したがって、私は書く必要があります、

ここでCategoryID、aParentCategoryIDは0です

CategoryID30になる可能性がありますがParentCategoryID、0の場合は、その親カテゴリがわかります。

これはこれまでの私のSQLです:

SELECT        CategoryID, ParentCategoryID, Name, Published, Deleted, PictureID
FROM          Nop_Category
WHERE         (Deleted = 0) 
AND           (Published = 1) 
AND           (CategoryID = ParentCategoryID = 0)
4

2 に答える 2

1

2つのフィールドに対して同等性チェックを実行するには、AND演算子を使用して、フィールド名を2回指定します。

SELECT        CategoryID, ParentCategoryID, Name, Published, Deleted, PictureID 
FROM          Nop_Category 
WHERE         (Deleted = 0)  
AND           (Published = 1)  
AND           (CategoryID = ParentCategoryID AND ParentCategoryID = 0) 

しかし、そのように記述して同じ結果を達成することもできます。

SELECT        CategoryID, ParentCategoryID, Name, Published, Deleted, PictureID 
FROM          Nop_Category 
WHERE         (Deleted = 0)  
AND           (Published = 1)  
AND           (CategoryID = 0 AND ParentCategoryID = 0) 

ただし、あなたの質問では、CategoryIDが30になる可能性があるため、クエリは機能しません。カテゴリIDを省略したり、パラメータを使用して特定のカテゴリIDを指定したりすることをお勧めします。

SELECT        CategoryID, ParentCategoryID, Name, Published, Deleted, PictureID, 
FROM          Nop_Category 
WHERE         (Deleted = 0)  
AND           (Published = 1)  
AND           (CategoryID = @categoryID AND ParentCategoryID = 0) 

編集:

したがって、categoryIDがCetegoryParentIDと同じである場合、私はその子を知っています。

一般に、自己関連のテーブルを作成するときは、ParentIdにNULLを使用します。これにより、現在の行が親であることがわかります。nullに0を使用している場合、CategoryIdが30でParentCategoryIdが30のレコードは、子でも親でもないことを意味します。

ID  PID  Value
0   0    Top Level - must exist for referential integrity
1   0    Child of "Top Level"
2   0    Another child of "Top Level"
3   1    Child of "Child of Top Level"

このシーンリオでは、トップレベルカテゴリを1つだけ持つことができ、他のすべてのカテゴリは子になります(ParentCategoryIdが0の親と見なしても、CategoryId 0の下に存在する必要があります)

NULLを使用する

ID  PID  Value
1   Null Top Level cat 1
2   Null Top Level cat 2
3   1    Child of "Top Level cat 1"
4   2    Child of "Top Level cat 2"

このシーンリオでは、すべてのトップレベルのカテゴリを簡単に見つけることができます

SELECT * FROM dbo.Category WHERE pid IS NULL

または、特定のカテゴリのトップカテゴリが必要な場合

SELECT * FROM dbo.Category WHERE CategoryId = 1 AND ParentCategoryId is null

そして、私の参照整合性は完全に損なわれていません。

親の直接の子を見つけるには、探している親のカテゴリIDを渡すだけです。

SELECT * FROM dbo.Category WHERE ParentCategoryId = 1
于 2012-07-08T15:50:28.023 に答える
0
SELECT        CategoryID, ParentCategoryID, Name, Published, Deleted, PictureID
FROM          Nop_Category
WHERE         Deleted = 0
AND           Published = 1
AND           ParentCategoryID = 0
于 2012-07-08T15:51:39.070 に答える