【问题标题】:Joins in SQL server加入 SQL 服务器
【发布时间】:2025-12-20 14:35:06
【问题描述】:

我有两张桌子:

  • 表 A(ID、名称、链接、类型、CID)
  • 表 B(ID、名称、链接、ImagePath、价格、CID)

我的问题是我想根据 ID 加入这两个表

ID       Name     Type         CID
1        Apple    Category     0
2        TV       Category     0
3        Laptop   Category     0

在同一个表 A 中,Apple tv 和笔记本电脑的 ID 作为 CID 传递给子类别

ID      Name      Type               CID
4       Macbook   sub category       1
5       iTV       sub category       2
6       HP        sub category       3

类别 ID 与 CID 在同一表中的子类别中。子类别的ID将与CID在同一个表中传递给子类别

ID       Name        Type                CID
7        Applebook   Child category      4
8        TV MLT2     child category      5
9        HP Mini     Child Category      6

子类别的 ID 将作为 CID 传递给表 B,即 7 8 和 9。

现在我应该如何加入这些表,我应该搜索 APPLE 我应该同时拥有表 a 和 B 中的所有苹果产品。我应该怎么做才能将表 A 与 B 基于 ID 连接,然后将子类别与基于 ID 和 CID 的子类别连接,然后与主类别连接。我应该使用什么连接?

我对连接的理解很好,我猜是左内右外,但我不知道在我的情况下应该怎么做?如何在 ID 的基础上加入我的类别,然后加入子类,然后加入子类,然后表 B 中的子类成为其他 CID

【问题讨论】:

  • 您应该编辑您的问题以包含您的实际表格和数据以及您想要的输出的清晰示例。
  • 请显示类别“Apple”的预期输出。

标签: sql sql-server join left-join


【解决方案1】:

你只需要多次使用普通连接:

select 
    C.*
from
    yourtable a
    join yourtable b on a.ID = b.CID
    join yourtable c on b.ID = c.CID
where 
    a.name = 'Apple'

【讨论】:

  • 如果类别中可能存在任意深度级别,则需要递归 CTE。
  • 这让我很困惑,因为我在“类别”中有产品,它有 ID,而那些“类别”有“太阳类别”,并且有来自 ID 的 CID,子类别的 ID 被传递给子类别由于这些子类别的 CID 和 ID 正在作为 CID 传递到另一个表现在我想要苹果和其他类别的所有数据以及连接我只了解基本连接我不知道在这种情况下该怎么做
  • @jamesZ join 我猜想或者我还没有完全理解,我认为这将是从表 B 到 A 在子类别中然后从子到子然后从子到主类别的路径,为此我该怎么办?
  • 同一个表被多次加入这个“路径”。不知道你的实际问题是什么。就像@RossPresser 说的那样,如果它不是一直只有 3 深,那么您将需要一个递归 CTE。
  • 实际上,我只有 14 个类别,然后是子类别,然后是另一个表中的数据,@RossPresser 和 JamesZ 我正在为每个类别构建存储过程,因为你可以说 14 个过程,我将不得不使用对于每个类别,并通过存储过程显示其数据,请告诉我如何使用多个连接