有没有办法在LEFT JOIN行之间建立UNION,以使结果不在单独的列(lev1,lev2,lev3和lev4)中,而是在单个列中(即“ ItemNo”)?
这是MySQL查询:
SELECT t1.ItemID AS lev1, t2.ItemID as lev2, t3.ItemID as lev3, t4.ItemID as lev4
FROM TableOfRelations AS t1
LEFT JOIN TableOfRelations AS t2 ON t2.ParentItemID = t1.ItemID
LEFT JOIN TableOfRelations AS t3 ON t3.ParentItemID = t2.ItemID
LEFT JOIN TableOfRelations AS t4 ON t4.ParentItemID = t3.ItemID
WHERE t1.ParentItemID = (SELECT ID FROM TableOfItems WHERE ItemID = 3599);
编辑:
这是我正在寻找的结果样本:
ItemID ParentItemID JoinedDescription1 JoinedDescription2
3599 NULL MyString1A MyString1B
35 3599 MyString35A MyString35B
168 3599 MyString168A MyString168B
192 168 MyString192A MyString192B
238 3599 MyString238A MyString238B
266 168 MyString266A MyString266B
此结果将用于使用VB.NET填充TreeView。另外,“ JoinedDescriptions”还没有根据ItemID从另一个表进行联接,但是我认为一旦正确地获得了基本表,我就可以轻松地进行处理。
重要说明:这些选定的行仅属于一个项目(在本示例中为根项目“ 3599”),这意味着数千行中只有几行。一些递归示例假定查询中使用了所有表行,而我不是这种情况。
最佳答案
不,实际上没有办法在LEFT JOIN操作之间进行UNION。
但是您可以通过将查询变成内联视图,使用查询中的结果集获得所需的结果。
这是一种方法:
SELECT u.i AS lev
, CASE u.i
WHEN 1 THEN t.lev1
WHEN 2 THEN t.lev2
WHEN 3 THEN t.lev3
WHEN 4 THEN t.lev4
END AS levItemID
FROM ( SELECT 1 AS i
UNION ALL SELECT 2
UNION ALL SELECT 3
UNION ALL SELECT 4
) u
CROSS
JOIN ( SELECT t1.ItemID AS lev1
, t2.ItemID AS lev2
, t3.ItemID AS lev3
, t4.ItemID AS lev4
FROM TableOfItems t0
JOIN TableOfRelations t1
ON t1.ParentItemID = t0.id
LEFT
JOIN TableOfRelations t2
ON t2.ParentItemID = t1.ItemID
LEFT
JOIN TableOfRelations t3
ON t3.ParentItemID = t2.ItemID
LEFT
JOIN TableOfRelations t4
ON t4.ParentItemID = t3.ItemID
WHERE t0.ItemID = 3599
) t
注意:这实际上更像是UNION ALL操作,它不会删除重复项,它返回NULL值,并返回父级。
您可以调整查询以获得所需的结果。如果您不关心级别号,请从SELECT列表中删除
u.i
。要删除重复项,可以在SELECT之后添加DISTINCT关键字,或添加GROUP BY子句。要消除NULL值,可以添加
HAVING levItemID IS NOT NULL
子句,等等。