【问题标题】:Left outer join (join between three tables)?左外连接(三个表之间的连接)?
【发布时间】:2008-11-16 23:14:03
【问题描述】:

我有一个必须从中获取数据的主表。我有一个左外连接,其中字段将匹配 40% 的时间。然后我有另一个连接,我需要将表 A 中的数据与之匹配。

这是伪代码中的 SQL。此查询不起作用。

-- 这是我想做但不起作用的部分。 AND H.COL3 = A.STATE????

我正在使用 IBM DB2。

SELECT DISTINCT
  APP_NO as app_no,
  A.STATE as state
  ...
  ... Fields
  ...
FROM 
  TABLE_A A
LEFT OUTER JOIN  
  TABLE_B HIST
ON
  HIST.COL1 = A.COL1
, TABLE_C B  
LEFT OUTER JOIN
  TABLE_D H  
ON
  H.COL2 = B.COL2
-- This is the part I want to do but doesn't work.
AND
  H.COL3 = A.STATE????
WHERE
  A.BRANCH = 'Data'

【问题讨论】:

  • 为什么不起作用?你遇到了什么错误?
  • 在 DB2 中,我收到以下错误。如果我删除有问题的行,那么它可以工作。错误:SQL0338N 与 JOIN 运算符或 MERGE 语句关联的 ON 子句无效。 SQLSTATE=42972(状态:42972,本机代码:FFFFFEAE)
  • 请通过此链接。 techpint.com/programming/how-sql-joins-works。我已经演示了一个包含脚本的示例。它包含完全相同的案例。

标签: sql db2 left-join


【解决方案1】:

我认为你可以这样重写它(但我可能读错了你的陈述)

FROM 
  TABLE_A A LEFT OUTER JOIN TABLE_B HIST ON
      HIST.COL1 = A.COL1
  LEFT OUTER JOIN TABLE_D H ON 
      H.COL3 = A.STATE
  LEFT OUTER JOIN TABLE_C B ON H.COL2 = B.COL2
WHERE
  A.BRANCH = 'Data'

此外,有关此错误的 IBM 文档指出:

与 JOIN 运算符或 MERGE 语句关联的 ON 子句无效。 说明:

ON 子句中的列引用只能引用 ON 子句范围内的表列。

所以我可能弄错了,当外部连接“H.COL3 = A.STATE”超出 On 子句的范围时,它看起来就像错误的 ON 子句,因为表 A 不在该范围内。

【讨论】:

  • "所以我可能弄错了,当外部连接 "H.COL3 = A.STATE" 超出 On 子句的范围时,它看起来就像错误的 ON 子句,因为表 A 不在那个范围。”这可能是正确的,但我将如何将它添加到范围内。让我看看你的例子。
  • 该代码似乎有效,但我的结果集没有返回正确的结果。我希望有某种方法可以以某种方式使用状态“别名”:ON H.COL2 = B.COL2 AND H.COL3 = state 我想使用为来自表“A”的特定行返回的状态
  • 为什么没有返回正确的结果?从我读过的内容来看,你是原创。查询希望 table_d 中的行不必与 table_c (col2) 和 table_a (state) 匹配。我认为我的查询应该产生。
  • 我原来的查询可能是错误的。你做得很好。理论上,这是我数据库中的内容。 Table_A 是我的主要报告查询。 123, NY 123, TX 我想返回 State 列 A 与 Table_D 中的 state 列匹配的行,但同时保留表 C 上的连接。
  • 好的,只需将“左外连接”更改为 table_d 连接上的“内连接”,例如:INNER JOIN TABLE_D H ON H.COL3 = A.STATE。这样,您将始终获得 macthing 状态,以及在表 C 和 D 上的 COL2 之间不一定具有匹配行的行。如果我错了,请纠正我
【解决方案2】:

如果在 WHERE 子句中加入“AND H.COL3 = A.STATE”会发生什么?

【讨论】:

  • 在 DB2 中,我收到以下错误。如果我删除有问题的行,那么它可以工作。错误:SQL0338N 与 JOIN 运算符或 MERGE 语句关联的 ON 子句无效。 SQLSTATE=42972 (State:42972, Native Code: FFFFFEAE) 如果我把它放在任何地方,我会得到这个错误。
  • H.COL3 在 SELECT 字段列表中吗?有些数据库就是这样挑剔的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-26
  • 2018-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-28
  • 2018-11-22
相关资源
最近更新 更多