如何编写sql查询来获取数据

时间:2015-01-27 09:53:11

标签: sql

我在同一个表中有子表和父表层次结构的表。 我有列来标识相应节点的父节点。 记录如

Id  name  Parent
1    ABC   Null
2    PQR   1
3    DEF   Null
4    LMN   Null
5    OPQ   Null
6    JKL    2
7    TUY    4

CREATE TABLE #Temp
(
   Id INT,
   Name varchar(3),
   Parent INT
)

INSERT INTO #Temp VALUES (1,’ABC’,Null)
INSERT INTO #Temp VALUES (2,’PQR’, 1)
INSERT INTO #Temp VALUES (3,’DEF’, Null)
INSERT INTO #Temp VALUES (4,’LMN’, Null)
INSERT INTO #Temp VALUES (5,’OPQ’, Null)
INSERT INTO #Temp VALUES (6,’JKL’, 2)
INSERT INTO #Temp VALUES (7,’TUY’, 4)

如何编写查询以找出有孩子的父母和孩子的id? 多了一个查询,找到没有父母的孩子?

4 个答案:

答案 0 :(得分:0)

我的问题不够明确。没有孩子的父母应该出现在查询中?你想要每个父子的记录,或者这种类型的一行:parentid-son1; son2; son3;?

作为示例,您可以使用此代码:

SELECT p.id as parentid, h.id as sonid FROM #temp p INNER JOIN #temp h ON p.id = h.parent

答案 1 :(得分:0)

查询以找出有孩子和孩子身份的父母

SELECT parent, id AS "Child"
FROM #Temp
WHERE Parent is not null

查询找到没有父母的孩子

SELECT id AS "Child"
FROM #Temp
WHERE Parent is null

答案 2 :(得分:0)

没有大量清楚你的要求,并假设它只是上面的单个表格,我认为只要不包括NULLS就可以得到你想要的。

SELECT Id, name, parent
FROM #Temp
WHERE parent IS NOT NULL

答案 3 :(得分:0)

看起来您正在使用Sql Server。我将使用recursive cte

执行此操作
;WITH cte
     AS (SELECT id,name,Parent,0 AS level
         FROM   #Temp
         WHERE  Parent IS NULL
         UNION ALL
         SELECT b.id,b.name,b.Parent,level + 1
         FROM   cte a
                JOIN #Temp b
                  ON a.Id = b.Parent)
SELECT b.Id,b.Name,b.Parent
FROM   cte a
       JOIN cte b
         ON a.Parent = b.Id
WHERE  a.level >1