要对两个字段执行相等检查,请使用 AND 运算符并指定字段名两次。
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,因此您的查询将不起作用。您可能希望省略 CategoryID 或通过参数指定特定的 categoryId:
SELECT CategoryID, ParentCategoryID, Name, Published, Deleted, PictureID,
FROM Nop_Category
WHERE (Deleted = 0)
AND (Published = 1)
AND (CategoryID = @categoryID AND ParentCategoryID = 0)
编辑:
因此,如果 categoryID 与 CetegoryParentID 相同,我就知道它是一个孩子。
通常,当我做自相关表时,我使用 NULL 作为 ParentId,它告诉我当前行是父行。如果您使用 0 表示 null,则 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
而且我的参照完整性是完全正确的。
要查找父级的直系子级,只需传入您要查找的父级的 categoryid:
SELECT * FROM dbo.Category WHERE ParentCategoryId = 1