0

誰かが行ったオラクルの選択を変更する必要があります...理解する必要があります...それは悪い選択だと思いますが、よくわかりません:

FROM user01.myTable FULL OUTER JOIN 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_alias2 を myTable_aliasXXX に置き換えると、選択が正しく機能します!

わかりません。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 つのコピーがあり、2 番目のコピーが別の名前 (エイリアス) を取得するかのように機能するため、最初のコピーとは区別されます。

しかし、私はこのようにすべて書くことができます: ...

いいえ、あなたの書き直しは最初の (FULL JOIN) バージョンと同等ではありません。結合は、同じ列で完全に行われるわけではありません。

この部分:

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

テーブルの最初のコピーの行が、2 番目のコピーの別の行と一致することを意味します。

于 2012-03-14T17:04:54.347 に答える
0

これは完全外部結合に限ったことではありません。テーブルを結合するときはいつでも、テーブル名に別名を付け、それらの別名を使用して列名を修飾することをお勧めします。テーブルをそれ自体に結合する自己結合を行う場合は、テーブルの 2 つのインスタンスのうち少なくとも 1 つにエイリアスを設定する必要があります。

たとえば、標準のSCOTTテーブルEMPとがある場合DEPT、エイリアスなしでクエリを書くことができます

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)

後者の場合、EandDはデータベース内のオブジェクトではありません。これらは、クエリの範囲内で使用できる テーブルのエイリアス、EMPおよびの単なる省略形です。DEPT

テーブルをそれ自体に結合したい場合-たとえば、従業員とそのマネージャーのレポートが必要な場合は、自己結合を記述できます

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

この場合、EMPテーブルをそれ自体に結合しており、エイリアスはテーブルの各インスタンスが表すデータのセットを識別するのに役立ちEMPます。1 つのインスタンスは従業員に関する情報を提供し、1 つのインスタンスはマネージャーに関する情報を提供しています。

于 2012-03-14T17:05:47.707 に答える