0

我必须修改某人所做的甲骨文选择......我需要理解......我认为这是一个糟糕的选择,但我不确定:

从 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 

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

4

2 回答 2

1

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

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

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

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

这部分:

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

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

于 2012-03-14T17:04:54.347 回答
0

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

例如,如果我有标准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)

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

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

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

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

于 2012-03-14T17:05:47.707 回答