从多个行的比较中获取同一个表中的数据?

时间:2014-01-20 15:08:14

标签: sql tsql

我有一张像贝洛一样的表......

    ProjectID  |  ParentID  |  Project Name  ...
    ----------------------------------------
         1     |      1     |  Project Name 1...
         2     |      2     |  Project Name 2...
         3     |      3     |  Project Name 3...
         4     |      1     |  Project Name 4 & Sub Project 1...
         5     |      1     |  Project Name 5 & Sub Project 1...
         6     |      1     |  Project Name 6 & Sub Project 1...
         7     |      4     |  Project Name 7 & Sub Project 1 & Sub Project 4...
         8     |      4     |  Project Name 8 & Sub Project 1 & Sub Project 4...
         9     |      9     |  Project Name 9...

此处 ProjectID 是主键& ParentID 表示子项目的主要或主要ProjectID。如果ProjectID = ParentID,则表示它是主(主)项目

现在问题是我是否想要取出子项目的子项目,这意味着, 如果我想看到 1 下的子项目,那么put就是......

    ProjectID  |  ParentID  |  Project Name  ...
    ----------------------------------------
         1     |      1     |  Project Name 1...
         4     |      1     |  Project Name 4 & Sub Project 1...
         5     |      1     |  Project Name 5 & Sub Project 1...
         6     |      1     |  Project Name 6 & Sub Project 1...
         7     |      4*    |  Project Name 7 & Sub Project 1 & Sub Project 4...
         8     |      4*    |  Project Name 8 & Sub Project 1 & Sub Project 4...
  • 这里4是1和7,8的子项目是4
  • 的子项目

我如何比较?我是否必须使用#temp为1然后考虑#temp表的主要ID?或者有更好的解决方案吗?

3 个答案:

答案 0 :(得分:0)

我认为最简单的方法是搜索ProjectName列。它似乎包含层次结构信息:

select c.*
from content c
where ProjectName+' ' like '%Project 1 %'

额外的空格是确保Project 1Project 10不匹配。

答案 1 :(得分:0)

您可以尝试以下SQL查询:

select projectid, parentid, projectname
from project_table
where Projectname like '%Sub_Project_1/%' escape '/'
and Projectname = 'Project_Name_1/%' escape '/'; 

答案 2 :(得分:0)

我找到了解决的方法。但实际的解决方案由Jayvee给出。对不起,我不知道它调用的方法,所以我想我没有完美地解释它。实际上我想在ProjectID的方面使用递归。

DECLARE @ProjectID int = 1
WITH DirectReports 
AS
(
-- Anchor member definition
    SELECT C.*
    FROM tblProject AS C
    WHERE C.ProjectID = @ProjectID
    UNION ALL
-- Recursive member definition    
    SELECT C1.*
    FROM tblProject AS C1
    JOIN DirectReports AS d ON C1.ProjectID = d.ProjectID
)
-- Statement that executes the CTE
SELECT * FROM DirectReports
UNION ALL
SELECT C.*
FROM tblProject AS C
WHERE C.ProjectID = @ProjectID and C.ProjectID=C.ParentID

您可以找到更详细的Here。 感谢您的贡献。