2012-03-14 84 views
0

我必須修改一個選擇oracle有人這樣做...我需要了解...我認爲這是一個糟糕的選擇,但我不知道:甲骨文可能錯誤在選擇與全外部聯接

FROM user01.myTable FULL OUTER JOIN user01.myTablemyTable_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 

在什麼,我錯了嗎?我不明白?是特別是全外連接還是一個簡單的錯誤? 非常感謝您的時間!

回答

1

我認爲myTable_alias2就像user01.myTable

的副本是正確的。該表並未實際複製,但查詢的工作方式與您擁有該表的兩個副本相同,第二個副本獲得另一個名稱(別名),因此它與第一個不同。

但後來,我可以寫所有這樣的:...

不,你的重寫是不等同於第一(FULL JOIN)版本。加入不完全在同一列上完成。

這部分:

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

意味着從表的第一拷貝行將從第二拷貝相匹配不同行。

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) 

在後者的情況下,查詢,ED不是數據庫中的對象。它們只是它們別名的表的簡寫,即EMPDEPT,它們在查詢範圍內可用。

如果我想加入一個表itself--說,我希望員工和經理的報告,我可以寫一個自聯接

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

在這種情況下,我加入了EMP表本身和別名有助於確定EMP表的每個實例表示哪組數據。一種情況是提供有關員工的信息,一種情況是提供有關管理員的信息。