有没有办法在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子句,等等。

09-30 14:37
查看更多