我在MySQL中有一个简单的层次结构component
,该表由assembly
表描述。SQL - 在层次结构中唯一选择(可能缺少)子项
SELECT * FROM component;
+----+--------+------+
¦ id ¦ name ¦ type ¦
+----+--------+------+
¦ 11 ¦ car1 ¦ A ¦
¦ 12 ¦ car2 ¦ A ¦
¦ 13 ¦ car3 ¦ A ¦
¦ 21 ¦ motor1 ¦ B ¦
¦ 22 ¦ motor2 ¦ B ¦
¦ 31 ¦ brake1 ¦ C ¦
+----+--------+------+
SELECT * FROM assembly;
+----+-----------+----------+
¦ id ¦ parent_id ¦ child_id ¦
+----+-----------+----------+
¦ 1 ¦ 11 ¦ 21 ¦
¦ 2 ¦ 12 ¦ 22 ¦
¦ 3 ¦ 11 ¦ 31 ¦
¦ 4 ¦ 13 ¦ 31 ¦
+----+-----------+----------+
编辑:正如德姆正确猜测,原始帖子中缺少第三项(id = 3)。该表现在完成。
我想生成一个所有汽车的名单,其电机的名称,如果有的话。每辆车应该出现一次。
所需的输出:
+----------+------------+
¦ car_name ¦ motor_name ¦
+----------+------------+
¦ car1 ¦ motor1 ¦
¦ car2 ¦ motor2 ¦
¦ car3 ¦ ¦
+----------+------------+
有一个简单的方法来获得呢?
一辆汽车至多有一个汽车的孩子。
外连接与电动机部件的视图产生两行car1
和这不应该发生:
CREATE VIEW comp_motor
AS
SELECT * FROM component
WHERE type='B';
SELECT parent.name, child.name
FROM component parent
LEFT JOIN assembly a ON parent.id = a.parent.id
LEFT JOIN comp_motor child ON a.child_id = child.id
WHERE
parent.type = 'A';
这给出
+------+--------+
¦ name ¦ name ¦
+------+--------+
¦ car1 ¦ motor1 ¦
¦ car1 ¦ NULL ¦
¦ car2 ¦ motor2 ¦
¦ car3 ¦ NULL ¦
+------+--------+
第二行不应该存在。当然DISTINCT
在这种情况下不会起作用。
我无法更改数据库结构。
任何投入将是最受欢迎的!
你应该使用内部连接,如果你不想让第二排。 – Reddy 2012-01-16 11:45:34