使用SQL在2个字段之间进行等式检查

时间:2012-07-08 15:48:09

标签: sql sql-server-2008

我正在尝试查找父类别。

因此我需要写,

其中CategoryID的{​​{1}}为0

ParentCategoryID可能是30,但如果它的CategoryID为0,那么您就知道它是父类别。

到目前为止,这是我的SQL:

ParentCategoryID

2 个答案:

答案 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