当前位置: 首页 > 面试题库 >

如何左联接或内部联接表本身

赵献
2023-03-14
问题内容

例如,我在表中有此数据,

id      name        parent      parent_id
1       add         self        100
2       manage      null        100
3       add         10          200
4       manage      null        200
5       add         20          300
6       manage      null        300

left joininner join该表本身如何,这样我可以在下面获得此结果?

id      name        parent
2       manage      self
4       manage      10
6       manage      20

尽我所能,我只想用关键字“ manage”查询行,但我希望 add 的行中的列parent数据与结果中的 manage 行中的as相同。

是否有可能?

编辑:

我实际表格的简化版本- system

system_id   parent_id   type    function_name       name        main_parent         make_accessible     sort
31          30          left    main                Main        NULL                0                   1
32          31          left    page_main_add       Add         self                0                   1
33          31          left    page_main_manage    Manage      NULL                0                   2

我的实际查询已经很乱了…

SELECT 
    a.system_id,
    a.main_parent,
    b.name, 
    b.make_accessible, 
    b.sort

FROM system AS a

INNER JOIN -- self --
(
    SELECT system_id, name, make_accessible, sort
    FROM system AS s2

    LEFT JOIN -- search --
    (
    SELECT system_id AS parent_id
    FROM system AS s1
    WHERE s1.function_name = 'page'
    ) AS s1

    ON s1.parent_id = s2.parent_id

    WHERE s2.parent_id = s1.parent_id
    AND s2.system_id != s1.parent_id
    ORDER BY s2.sort ASC
) b
ON b.system_id = a.parent_id


WHERE a.function_name LIKE '%manage%'
ORDER BY b.sort ASC

结果我目前得到了

system_id   main_parent     name    make_accessible sort
33          NULL            Main    0                1

但是我在这之后

system_id   main_parent     name    make_accessible sort
33          self            Main    0                1

问题答案:

您只需要两次引用该表:

select t1.id, t1.name, t2.id, t2.name
from TableA t1 
  inner join TableA t2
    on t1.parent_id = t2.Id

如果要在列表中查看根,请用左联接替换inner。

更新:

我看错了你的问题。在我看来,您总是有两行,管理一行并添加一行。要通过管理进入“添加”,请执行以下操作:

select system.*, (select parent 
                    from system s2 
                   where s2.parent_id = system.parent_id 
                     and s2.name = 'add') 
                 AS parent
from system
where name = 'manage'

或者,您可以将表拆分为两个派生表,并通过parent_id将它们联接起来:

select *
  from system
  inner join
  (
     select * from system where name = 'add'
  ) s2
    on system.parent_id = s2.parent_id
  where system.name = 'manage'

这将允许您使用s2中的所有列。



 类似资料:
  • 问题内容: 我有一个网站,用户可以在其中查看电影列表,并为其创建评论。 用户应该能够看到所有电影的列表。此外,如果他们查看了电影,则他们应该能够看到他们给它的评分。如果不是,则仅显示没有得分的电影。 他们根本不在乎其他用户提供的分数。 考虑以下 我本质上想要的是 考虑以下内容: 两个测试都应打印完全相同的输出,但是,只有原始版本会吐出正确的结果表: orm会返回这个 任何试图加入其余主题的尝试,那

  • 问题内容: 我似乎无法内部连接到教师表以获得名字和姓氏。 我收到的错误消息是 问题答案: 以下错误是因为您未指定列: Msg 8156,第16级,状态1,第3行 为“ MaxBookingDays”多次指定了“ ID”列。 因此,我将您的查询稍作更改,如下所示:

  • 问题内容: 我有三个表: 命令 OrderId,int PK CustomerId,与客户之间为int FK,允许为NULL 顾客 CustomerId,int PK CompanyId,将FK转换为Company,不允许为NULL 公司介绍 CompanyId,int PK 名称nvarchar(50) 我想选择所有订单,无论是否有客户,如果有客户,也要选择客户的公司名称。 如果我使用此查询…

  • 问题内容: 这个问题已经在这里有了答案 : SQL中左右联结与左右联结之间的区别[重复] (4个答案) 6年前关闭。 我看到过称为LEFT OUTER JOIN或RIGHT OUTER JOIN的联接。在某些地方,我见过LEFT JOIN或RIGHT JOIN。我对此感到困惑。 我两天前发布了一个问题,但我无法理解解决方案提供的链接。 这些连接类型是否相同,或者两者之间有区别? 问题答案: 两者之

  • 问题内容: 很容易理解为什么左外部联接不是可交换的,但是我很难理解它们是否是可交换的。几家在线资源表明不是,但我还没有说服自己就是这种情况。 假设我们有三个表:A,B和C。 令A包含ID和B_ID两列,其中ID是表A的主键,B_ID是与表B的主键相对应的外键。 令B包含两列ID和C_ID,其中ID是表B的主键,C_ID是与表C的主键相对应的外键。 让C包含ID和VALUE两列,其中ID是表C的主键

  • 问题内容: 这个问题已经在这里有了答案 : SQL Server中的LEFT JOIN与LEFT OUTER JOIN (12个答案) 5年前关闭。 之间有什么区别? 问题答案: 在MySQL中,它们是同一回事。A 是的同义词或缩写。