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