【问题标题】:Oracle possible Error in Select with FULL OUTER JOIN使用 FULL OUTER JOIN 选择 Oracle 可能出错
【发布时间】:2012-03-14 16:53:38
【问题描述】:

我必须修改某人所做的 oracle 选择...我需要了解...我认为这是一个错误的选择,但我不确定:

FROM user01.myTable 完全外部联接 user01.myTable myTable_alias2

SELECT      
            myTable.field1 AS field1,
            myTable.date_hour AS date_hour,
            myTable.HOUR,
            DECODE (
                    myTable.aux1, 'CAT', 'CAT3', myTable.aux1
                    ) AS aux1,
            myTable.sum_count,
            myTable_alias2.sum_count AS sum_countx,
            myTable.aux2,
            myTable_alias2.aux2 AS aux2x
   FROM user01.myTable FULL OUTER JOIN user01.myTable myTable_alias2
            ON (myTable.field1 = myTable_alias2.field1
                  AND myTable.HOUR = myTable_alias2.HOUR
                  AND myTable.aux1 = myTable_alias2.aux1
                  AND TO_CHAR (TO_DATE (myTable.date_hour, 'YYYYMMDD') - 7,'YYYYMMDD') = myTable_alias2.date_hour
             )

我的系统中有一个 user01.myTable,但我的系统中没有 myTable_alias2。 如果我用 myTable_aliasXXX 替换所有 myTable_alias2 ,则选择可以正常工作!

我不明白,我认为 myTable_alias2 就像 user01.myTable 的副本,但如果是对的,我可以这样写:

SELECT         
            myTable.field1 AS field1,
            myTable.date_hour AS date_hour,
            myTable.HOUR,
            DECODE (myTable.aux1, 'CAT01L0', 'CAT01L03', myTable.aux1) AS aux1,
            myTable.sum_count,
        myTable.aux2
FROM user01.myTable 

我做错了什么?我不明白什么?是一个特殊的完全外连接还是一个简单的错误? 非常感谢您的宝贵时间!

【问题讨论】:

    标签: oracle select full-outer-join


    【解决方案1】:

    我认为 myTable_alias2 就像 user01.myTable 的副本

    没错。该表实际上并未被复制,但查询的工作方式就像您拥有该表的 2 个副本,而第二个副本获得了另一个名称(别名),因此它与第一个副本不同。

    但是,我可以这样写:...

    不,您的重写不等同于第一个(FULL JOIN)版本。连接不是完全在相同的列上完成的。

    这部分:

       TO_CHAR (TO_DATE (myTable.date_hour, 'YYYYMMDD') - 7,'YYYYMMDD') 
       = myTable_alias2.date_hour
    

    表示表的第一个副本中的行将与第二个副本中的不同行匹配。

    【讨论】:

      【解决方案2】:

      这不是完全外部联接所独有的。任何时候连接表时,最好给表名加上别名并使用这些别名来限定列名。如果您正在执行自连接,其中您将表连接到自身,则必须为表的两个实例中的至少一个设置别名。

      如果我有标准的SCOTTEMPDEPT,例如,我可以编写不带别名的查询

      SELECT emp.ename,
             dept.dname
        FROM emp 
             JOIN dept ON (emp.deptno = dept.deptno)
      

      或者我用别名编写查询

      SELECT e.ename,
             d.dname
        FROM emp e
             JOIN dept d ON (e.deptno = d.deptno)
      

      在后一种情况下,ED 不是数据库中的对象。它们只是它们别名的表的简写,EMPDEPT,在查询范围内可用。

      如果我想将一个表加入到自身中——比如说,我想要一份员工及其经理的报告,我可以编写一个自我加入

      SELECT employee.ename,
             manager.ename
        FROM emp employee
             JOIN emp manager ON (employee.mgr = manager.empno)
      

      在这种情况下,我将EMP 表连接到自身,别名有助于识别EMP 表的每个实例所代表的数据集。一个实例提供有关员工的信息,一个实例提供有关经理的信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-10
        • 2014-05-22
        • 1970-01-01
        • 2012-02-13
        • 1970-01-01
        • 2019-01-27
        • 2019-08-07
        • 2011-09-28
        相关资源
        最近更新 更多