Sql 获取所有父行及其子行后面的每一行';s行

Sql 获取所有父行及其子行后面的每一行';s行,sql,Sql,我有两张桌子,其中一张叫 主要级别 另一个叫 次级 子级别具有来自主级别的外键(它们之间的关系主级别具有一个或多个子级别) 我想要的是创建一个查询,以显示主级别行,然后是所有子级别行,例如下面的屏幕截图(通过本机SQL查询或LINQ) 更新: 我在下面用过,但问题是它是完全外接等结果 select * from Sublevel right join Mainlevel on Sublevel.mainlevelID=Mainlevel.id order by coalesce(Suble

我有两张桌子,其中一张叫 主要级别 另一个叫 次级

子级别具有来自主级别的外键(它们之间的关系主级别具有一个或多个子级别)

我想要的是创建一个查询,以显示主级别行,然后是所有子级别行,例如下面的屏幕截图(通过本机SQL查询或LINQ)

更新:
我在下面用过,但问题是它是完全外接等结果

select * from Sublevel
right join Mainlevel
on Sublevel.mainlevelID=Mainlevel.id 
order by coalesce(Sublevel.mainlevelID, Mainlevel.id),
         (case when Sublevel.mainlevelID is null then 1 else 0 end),Mainlevel.id;

更新2:
此外,我尝试了以下查询,但没有成功:

SELECT
    s.name,
    s.Id,
    CASE WHEN s.is_child = 1 THEN s.parentID END AS parent_id,
    m.name
FROM
    Mainlevel m
    INNER JOIN (
    SELECT id, name, parentID, 1 AS is_child
    FROM Sublevel
    UNION ALL
    SELECT id, name,Null, 0 AS is_child
    FROM Mainlevel
    ) s on m.id = s.mainlevelID
ORDER BY  m.id,is_child, s.mainlevelID 


我在简单语言中的问题是如何使子行显示在父行下方

您可以使用
按顺序

order by coalesce(parentid, id),
         (case when parentid is null then 1 else 0 end),
         id

总体计划是按(父ID,子ID)的顺序加入父(父+子)订单

新澄清的列可用性采用的附加版本

SELECT
    w.name,
    w.id,
    CASE WHEN w.is_child = 1 THEN w.mid END AS parent_id
FROM
    Mainlevel m
    INNER JOIN (
    SELECT id, name, parentID AS mid, 1 AS is_child
    FROM Sublevel
    UNION ALL
    SELECT id, name, id AS mid, 0 AS is_child
    FROM Mainlevel
    ) w on m.id = w.mid
ORDER BY  m.id, is_child, w.id

这里的大多数人都希望示例表数据和预期结果是格式化文本,而不是图像。我不明白示例表数据是什么意思(因为我在Excell上表达了我想要的内容,然后从中截取了屏幕截图),我根据您上面的查询添加了一个新的查询。我在您的查询中发现字段名不一致,因此我不确定您在此处指定的列是否确实存在于表定义中,但我只是做了一次尝试,希望它对您有效……您的意思是在父级和子级之间的内部联接之后添加此字段吗table@user3189162 . . . 不,您可以对显示的表进行排序。我显示的表是我想要得到的结果,而不是我得到的结果。我会检查它,它只返回我想要的子行。父行后面跟着它们的子行s@user3189162如果您运行它,它也会返回父行,“c”子查询是父联合子查询。它显示子行旁边的父行看起来像完整的外部连接。请注意,在Excel输出中,父ID 5位于levelID=5的MainLevel下,而不是MainLevel2。这是让大多数人认为levelID是PK的导火索。。。
SELECT
    w.name,
    w.id,
    CASE WHEN w.is_child = 1 THEN w.mid END AS parent_id
FROM
    Mainlevel m
    INNER JOIN (
    SELECT id, name, parentID AS mid, 1 AS is_child
    FROM Sublevel
    UNION ALL
    SELECT id, name, id AS mid, 0 AS is_child
    FROM Mainlevel
    ) w on m.id = w.mid
ORDER BY  m.id, is_child, w.id