我正在尝试查找父类别。
因此我需要写,
其中CategoryID
的{{1}}为0
ParentCategoryID
可能是30,但如果它的CategoryID
为0,那么您就知道它是父类别。
到目前为止,这是我的SQL:
ParentCategoryID
答案 0 :(得分:1)
要对两个字段执行相等性检查,请使用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相同,我知道它的a 子。
通常当我做自相关表时,我对ParentId使用NULL,它告诉我当前行是父行。如果你使用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
我的参照完整性完全符合原因。
要查找父母的直接子女,只需传入您要查找的父母的类别ID:
SELECT * FROM dbo.Category WHERE ParentCategoryId = 1
答案 1 :(得分:0)
SELECT CategoryID, ParentCategoryID, Name, Published, Deleted, PictureID
FROM Nop_Category
WHERE Deleted = 0
AND Published = 1
AND ParentCategoryID = 0