【问题标题】:How to do three left joins in SQL如何在 SQL 中进行三个左连接
【发布时间】:2020-01-03 20:40:40
【问题描述】:

我知道如何进行左连接,但是当我向查询中添加两个时。它变得有点奇怪。所以,这里是任务。原始表 list20192 有 93 列和 85,353 行。但是,最终用户不同意没有描述性字段,例如标题或描述。一个领域,naics,是一个六位数的代码,他们想要一个行业头衔。对于与 naics 代码 551114 对应的标题,必须转到具有以下结构的 indcodes 表:

 state char(2)
 codetype   char(2)
 code      char(6)
 codetitle   varchar (115)

 GEOG Table
 state char (2)
 areatype char(2)
 area  (6)
 areaname varchar (254)
 areadesc varchar (254)

我正在使用以下查询将 list20192 中字段的描述性对应项附加到末尾。最终结果应该是 96 列和 85,353 行。此查询有效,但生成的行数太多了 6,800,277 行。

      Select list20192.*, geog.area, sizeclas.sizedesc
      from dbo.list20192
      left join dbo.indcodes on list20192.naics = indcodes.code
      left join dbo.sizeclas on list20192.sizeclass = sizeclas.sizeclass
      left join dbo.geog on list20192.area = geog.area
      where list20192.year = '2019' and list20192.qtr = '2'

最终结果应该是这样的。有两行,第六项在第二行。

  naics    codetitle    sizeclass       sizedesc              area     

  541114   Management       22      400 to 499 employees    000025      

  areaname
    Pershing

有什么想法可以调整此查询以不收到这么多结果吗?现在结果显示,它似乎给了我一个 geog 中每个区域值的结果,而不考虑状态。我处于状态 32。我的原始表 list20192 仅处理状态 32。对于每个状态,有许多区域值可能相同。例如,内华达州的 000003 地区是克拉克,而南达科他州的 000003 地区是比德尔县

【问题讨论】:

  • 您的代码看起来不错。问题似乎是错误的连接键,但这并不是人们不熟悉您的数据并提供帮助的真正问题。
  • @Gordon Linoff,结果我得到了 6,800,277 行,并且只有 2 个额外的列而不是 3 个。
  • 为了清楚起见 来表达您的连接,我会使用表别名,例如from dbo.list20192 aleft join dbo.indcodes b on a.naics = b.code 等等。当使用join .. on 语法时,表名在on 子句中明确指定,别名是最简单的方法。在整个查询中使用这些别名。
  • 您可能会重复,可以添加不同的,或者找到一个重复的并深入每个表以查看其是否有错误数据。

标签: sql join left-join


【解决方案1】:

行的激增无疑是由于在各种连接表中有多行,这些连接表与请求的连接键值匹配。查询将为每个 匹配组合生成一个输出行:例如,一个表的连接在一侧具有 2 个匹配键,在另一侧具有 5 个匹配键,将生成 2*5 = 10 个结果行。

一种简单的查找方法可能是一次添加一个JOIN 子句。

当然,在不知道您的数据是什么样子的情况下,我可能会手指geog 表。 (另外两个在我看来就像查找表。)

DISTINCT 子句可以过滤掉重复项,但请注意,这可能很昂贵。也许您需要更具体地了解这些表中的一个或多个。 . .

【讨论】:

  • 编辑了问题。
  • @PM77-1,它的工作原理是 state、areatype 和 area 是一个复合(或复合)主键。面积不是唯一的,因为面积值 000003 可能会出现多达 52 个其他时间(50 个州加上关岛和维尔京群岛)。
  • @Tim 这就是您的 JOIN 导致这么多行的确切原因。
  • @PM77-1,你对如何让它像 excel 中的 VLOOKUP 一样,并且只加入/附加相应的值有什么建议吗?
  • 我给出了一个最佳答案,但老实说,我不得不放弃这种方法并重新使用 excel 和 Vlookups。我认为使用 Joins 会很简单,但事实并非如此。
猜你喜欢
  • 2017-03-18
  • 2018-11-06
  • 2018-08-08
  • 1970-01-01
  • 1970-01-01
  • 2018-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多