Sql 左外联接(三个表之间的联接)?

Sql 左外联接(三个表之间的联接)?,sql,db2,left-join,Sql,Db2,Left Join,我有一个主表,我必须从中获取数据。我有一个左外联接,其中字段将在40%的时间内匹配。然后我有另一个连接,我需要将表A中的数据与 这是伪代码中的SQL。此查询不起作用 --这是我想做但不起作用的部分。 H.COL3=A.STATE 我正在使用IBMDB2 SELECT DISTINCT APP_NO as app_no, A.STATE as state ... ... Fields ... FROM TABLE_A A LEFT OUTER JOIN TABLE

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

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

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

我正在使用IBMDB2

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'

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

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

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

此外,此错误的IBM doco声明:

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

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


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

我认为您可以这样重新编写它(但我可能读错了您的语句)

此外,此错误的IBM doco声明:

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

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


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

为什么它不起作用?您得到了什么错误?在DB2中,我得到了以下错误。如果我删除了有问题的行,那么它就工作了。错误:SQL0338N与JOIN运算符关联的ON子句或MERGE语句中的ON子句无效。SQLSTATE=42972(State:42972,本机代码:fffff eae)请通过此链接。我已经演示了一个包含脚本的示例。它包含与你所问的完全相同的情况。为什么不起作用?您得到了什么错误?在DB2中,我得到了以下错误。如果我删除了有问题的行,那么它就工作了。错误:SQL0338N与JOIN运算符关联的ON子句或MERGE语句中的ON子句无效。SQLSTATE=42972(State:42972,本机代码:fffff eae)请通过此链接。我已经演示了一个包含脚本的示例。它包含与您要求的完全相同的情况。如果我删除了有问题的行,那么它就工作了。错误:SQL0338N与JOIN运算符关联的ON子句或MERGE语句中的ON子句无效。SQLSTATE=42972(State:42972,本机代码:fffff eae)如果我把它放在任何地方,就会出现这个错误。H.COL3是否在选择字段列表中?有些数据库就是这样的。如果我删除了有问题的行,那么它就工作了。错误:SQL0338N与JOIN运算符关联的ON子句或MERGE语句中的ON子句无效。SQLSTATE=42972(State:42972,本机代码:fffff eae)如果我把它放在任何地方,就会出现这个错误。H.COL3是否在选择字段列表中?有些数据库就是这样挑剔的。“所以我可能弄错了,当外部连接“H.COL3=A.STATE”超出ON子句的范围时,它看起来像是erronous ON子句,因为表A不在该范围内。”这可能是对的,但我如何将其添加到范围内呢。让我看一看你的例子。这段代码似乎有效,但我的结果集没有返回正确的结果。我希望有某种方法可以以某种方式使用状态“alias”:在H.COL2=B.COL2和H.COL3=state上,我希望使用为表“A”中的特定行返回的状态,为什么它不返回正确的结果?从我所读到的,你是原作者。查询需要表_d中不必与表_c(col2)和表_a(state)匹配的行。我认为我的查询应该会产生这样的结果。我最初的查询可能是错误的。你做得很好。理论上,这是我数据库中的数据。表A是我的主要报表查询。123,NY 123,TX我想返回状态列A与表D中的状态列相匹配的行,但同时保留表C上的连接。好的,只需将表D上的“左外部连接”更改为“内部连接”,例如:H.COL3=A.State上的内部连接表D H。这样,您将始终获得macthing状态,以及表C和D上COL2之间不一定有匹配行的行。如果我错了,请纠正我“因此我可能错了,它看起来就像外部连接“H.COL3=A.STATE”时的erronous on子句超出on子句的范围,因为表A不在该范围内。”这可能是对的,但我如何将其添加到范围中呢。让我看一看你的例子。这段代码似乎有效,但我的结果集没有返回正确的结果。我希望有某种方法可以以某种方式使用状态“alias”:在H.COL2=B.COL2和H.COL3=state上,我希望使用为表“A”中的特定行返回的状态,为什么它不返回正确的结果?从我所读到的,你是原作者。查询需要表_d中不必与表_c(col2)和表_a(state)匹配的行。我认为我的查询应该会产生这样的结果。我最初的查询可能是错误的。你做得很好。理论上,这是我数据库中的数据。表A是我的主要报表查询。123,NY 123,TX我想返回状态列A与表D中的状态列相匹配的行,但同时保留表C上的连接。好的,只需将表D上的“左外部连接”更改为“内部连接”,例如:H.COL3=A.State上的内部连接表D H。这样你就可以一直看到macthing状态,以及表C和表D中COL2之间不一定有匹配行的行。如果我错了,请纠正我
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'