我正在尝试创建层次结果集。表中的示例记录。 在下面的输出中,我在第二列(root)中没有父名,同样,我有22个父母(根!没有超级父母)。
Child Name Parent
-----------------
1 A 1-3
2 B 1-3
3 C 1-3
1-3 D 1-10
3-5 E 1-10
6-10 F 1-10
1-10 G 1-100
201 w 200-210
202 x 200-210
203 y 200-210
200-210 z 200-300
我的代码:在这里,我已经编写了3次Mysql连接查询以获得4个级别。
SELECT
t1.Child ,
t1.Name ,
t2.Child ,
t2.Name ,
t3.Child ,
t3.Name,
t4.Child ,
t4.Name
FROM
code t1
left join code t2 on t1.Child = t2.Parent
left join code t3 on t2.Child = t3.Parent
left join code t4 on t3.Child = t4.Parent
输出:
t1.Child t1.Name t2.Child t2.Name t3.Child t3.Name t4.Child t4.Name
-------------------------------------------------------------------
1-100 root 1-10 G 1-3 D 1 A
1-100 root 1-10 G 1-3 D 1 B
1-100 root 1-10 G 1-3 D 1 C
1-10 G 1-3 D 1 A
1-10 G 1-3 D 1 B
1-10 G 1-3 D 1 C
1-3 D 1 A
1-3 D 1 B
1-3 D 1 C
200-300 root 200-210 z 201 w
200-300 root 200-210 z 202 x
200-300 root 200-210 z 203 y
200-210 z 201 w
200-210 z 202 x
200-210 z 203 y
我只是想要第1到3行& 10 - 12,
我正在寻找像
这样的行Grand Parents1(Root)给大孩子们
Grand Parents2(Root)给大孩子们
但不是第4 - 9行& 13 - 15因为信息是重复的,我已经在第3,4,5,6 ......等等中有这些信息。
我不希望再次重复行
例外输出:
t1.Child t1.Name t2.Child t2.Name t3.Child t3.Name t4.Child t4.Name
-------------------------------------------------------------------
1-100 root 1-10 G 1-3 D 1 A
1-100 root 1-10 G 1-3 D 1 B
1-100 root 1-10 G 1-3 D 1 C
200-300 root 200-210 z 201 w
200-300 root 200-210 z 202 x
200-300 root 200-210 z 203 y
由于
答案 0 :(得分:0)
你走在正确的轨道上。您可以在exists
子句中使用where
:
SELECT t1.Child, t1.Name, t2.Child, t2.Name,
t3.Child, t3.Name, t4.Child, t4.Name
FROM code t1 LEFT JOIN
code t2 on t1.Child = t2.Parent LEFT JOIN
code t3 on t2.Child = t3.Parent LEFT JOIN
code t4 on t3.Child = t4.Parent
WHERE NOT EXISTS (SELECT 1
FROM code c
WHERE c.Child = t1.Parent
);
这将只返回以root开头的行。
在您的情况下,您还可以更简单地执行:
WHERE t1.Name = 'root'
如果您愿意。