【问题标题】:How to solve ambiguous outer join error while joining two sets of tables连接两组表时如何解决不明确的外连接错误
【发布时间】:2015-11-11 09:59:08
【问题描述】:

我有 2 组表,每组都包含一个表头和明细表。其中一组是包含最终记录列表的主集,另一组是补充集。每个明细表都有一个数量字段。我需要加入两组表并汇总两组表的数量字段,但如果补充集中的记录较少,我需要显示一个空值并排除记录本身。 这是只显示匹配记录的数据的查询,我需要在补充集的数量字段中显示主集中所有具有空值的记录。

SELECT   LTOH.txn,
           LTOH.txnno,
           LTOI.itemcode,
           SUM (LTOI.qty) AS SumOfqty,
           SUM (BTI.qty) AS SumOfqty1
    FROM      (   BTH
               INNER JOIN
                  BTI
               ON BTH.hsysid = BTI.ltohsysid)
           INNER JOIN
              (   LTOH
               INNER JOIN
                  LTOI
               ON LTOH.hsysid = LTOI.ltohsysid)
           ON     (BTI.itemcode = LTOI.itemcode)
              AND (BTH.txnno = LTOH.txnno)
              AND (BTH.txn = LTOH.txn)
GROUP BY   LTOH.txn, LTOH.txnno, LTOI.itemcode
  HAVING   ( ( (LTOH.txn) = "ABC") AND ( (LTOH.txnno) = "1"));

【问题讨论】:

  • 哪个表是“主集”?两个代码帖子,我没有看到任何外部连接。你能发布实际引发错误的代码吗?
  • LTOH & LTOI 为主集,记录完整,BTH & BTI 为补充集,记录完整或更少。
  • 我很难理解,我需要尽快上床睡觉,但是……发布的查询真的有效吗?通常你需要给这些子表起别名,即你需要像ON BTH.hsysid = BTI.ltohsysid) T1这样的东西,它将那个部分别名为T1然后这个ON BTH.hsysid = BTI.ltohsysid)会变成这样:ON T1.hsysid = T2.ltohsysid)`
  • “更少的记录”是指COUNT(*) 还是SUM(QTY)
  • 头表之间是否存在 0 或 1 对 1 的关系?即没有重复计算

标签: sql join oracle11g


【解决方案1】:

更改连接的顺序,以便 LTOI 在与已定义的 BTI 相关时排在第一位,而在与 LTOI 和 BTI 相关联时 LTOH 在排在最后。也删除了一些不需要的 ()。

简单地说,连接必须按顺序发生。如果关系定义为 A-->B-->C-->D,则必须按该顺序定义连接。如果你尝试去 A-->B-->D-->C;你会得到你显示的错误语法,因为引擎不知道如何将 D 连接到 A,B 已经定义。 SQL 引擎通常按列出的顺序解析 FROM 子句。我之所以这么说是因为,在 Microsoft Access 中,用户可以使用 () 来表示引擎执行连接的顺序。我不确定是否有任何企业 RDBMS 会这样做,我通常按键的顺序定义它们以使阅读更容易……听起来我需要尝试一下!但是,您的 () 并没有在您的 from 子句中增加值来表示顺序。

SELECT LTOH.txn,
  LTOH.txnno,
  LTOI.itemcode,
  SUM (LTOI.qty) AS SumOfqty,
  SUM (BTI.qty)  AS SumOfqty1
FROM BTH
INNER JOIN bti
   ON BTH.hsysid = BTI.ltohsysid
RIGHT JOIN  ltoi
   ON bti.itemcode = ltoi.itemcode
RIGHT JOIN ltoh
   ON ltoh.hsysid   = ltoi.ltohsysid
  and bth.txnno   = ltoh.txnno
  and bth.txn     = ltoh.txn
GROUP BY ltoh.txn, ltoh.txnno, ltoi.itemcode
HAVING LTOH.txn = "ABC"
  and  LTOH.txnno    = "1";

【讨论】:

  • 感谢回复,但仍然只显示2条记录(与补充集匹配)。主集有 3 条记录,补充集有 2 条记录。我需要显示 3 条记录。
  • 可能为时已晚,但我仍然认为这可以通过简单的连接来实现,而无需使用外连接语法的内联视图
【解决方案2】:

我通过以下方法得到了想要的结果:

 SELECT   LTOHGROUP.txn,
           LTOHGROUP.txnno,
           LTOHGROUP.itemcode,
           SUM (LTOHGROUP.qty) AS SumOfqty,
           SUM (BTHGROUP.qty) AS SumOfqty1
    FROM      (SELECT   LTOH.*, LTOI.*
                 FROM      LTOH
                        INNER JOIN
                           LTOI
                        ON LTOH.hsysid = LTOI.ltohsysid) LTOHGROUP
           LEFT JOIN
              (SELECT   BTH.*, BTI.*
                 FROM      BTH
                        INNER JOIN
                           BTI
                        ON BTH.hsysid = BTI.ltohsysid) BTHGROUP
           ON     (LTOHGROUP.itemcode = BTHGROUP.itemcode)
              AND (LTOHGROUP.txnno = BTHGROUP.txnno)
              AND (LTOHGROUP.txn = BTHGROUP.txn)
GROUP BY   LTOHGROUP.txn, LTOHGROUP.txnno, LTOHGROUP.itemcode
  HAVING   ( ( (LTOHGROUP.txn) = 'ABC') AND ( (LTOHGROUP.txnno) = '1'));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 2021-01-23
    • 1970-01-01
    相关资源
    最近更新 更多