【问题标题】:SQL trying to do a JOIN to include results from multiple TablesSQL 尝试执行 JOIN 以包含来自多个表的结果
【发布时间】:2023-03-17 07:08:01
【问题描述】:

我是一个完全的新手,通过在工作中编写和修改一些查询和报告来自学 SQL。 我已经掌握了各种类型的 JOIN,并且我已经使用了几次 INNER JOIN 并取得了不错的成功。

我坚持的应该是一项简单的任务,但我的 Google-Fu 一定很弱。这就是我想要做的。

假设我有 3 个表,Table_A、Table_B 和 Table_C,每个表都有一个名为 [Serial_Number] 的列。

如果 A.Serial_Number = B.Serial_Number OR C.Serial_Number,我要选择其他 3 列。

我已经尝试过:

SELECT 
   * 
FROM 
  Table_A AS A 
  INNER JOIN Table_B AS B ON A.Serial_Number = B.Serial_Number
  INNER JOIN Table_C AS C ON A.Serial_Number = C.Serial_Number

但这总是产生 0 结果,因为数据的性质表明如果 A 匹配 B,它将永远不会匹配 C,反之亦然。我还尝试了 LEFT OUTER JOIN 作为第二个子句,但这仅包括 Table_C 中已经在 Table_B 上匹配的 NULL。

我所做的与多个表上的 JOIN 相关的所有搜索似乎都是关于使用 JOINS 进一步排除记录,而我实际上希望在其中包含更多记录。

就像我说的,我确信这真的很简单,只需要朝着正确的方向轻推。

谢谢!

【问题讨论】:

  • 嗯,可能是tabular format 中的一个简单示例,您的预期结果将有助于澄清这个问题。
  • 连接是水平的。因此,如果同时在 A=B 和 AC 上进行连接,则外连接将给出空值,而内连接将为空。所以请举例说明一些输入数据和输出应该是什么样子。

标签: sql join


【解决方案1】:

这里使用两个内连接类似于说

If A.Serial_Number = B.Serial_Number AND    
   A.Serial_Number = C.Serial_Number

在第二个子句上使用左外连接——我认为你的意思是第二次连接——将对已经由第一个内连接A.Serial_Number = B.Serial_Number 过滤的结果集执行左连接。鉴于 B.Serial_NumberC.Serial_Number 无关,您不会期望等值连接从 tablec 返回任何结果。

您想要的是left outer join,就像您尝试过的一样,但同时适用于 tableb 和 tablec。

Select *
From tablea
Left join tableb on tableb.Serial_Number = tablea.Serial_Number
Left join tablec on tablec.Serial_Number = tablea.Serial_Number

这样无论tablea.Serial_Number是否在tableb中,它仍然会被返回,因此可以加入tablec

【讨论】:

    【解决方案2】:

    同意。您的内部连接输出产生 NULL,这就是它导致 0 的原因。我建议修改您的 INNER JOIN。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-19
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-29
      相关资源
      最近更新 更多