2016-12-23 17 views
0

この時点で何が起こっているのかは本当に分かりません。私は、ビューを作成しようとしている、と私は下のクエリを実行すると:Oracle/PHP「無効な識別子」のエラー

$view = oci_parse($conn, ' 
       CREATE OR REPLACE VIEW 
        V_ORD_HISTORY 
       AS 
       SELECT 
        ARCUSTO.ID, 
        ORDERS.ID, 
        ORDERS.PONO, 
        ORDERS.ORDERNO, 
        ORDERS.DATE_TAKEN, 
        ORDERS.ARCUSTO_ID, 
        ORD_DETAIL.ORDERS_ID, 
        ORD_DETAIL.ID, 
        ORD_DETAIL.TOTAL_QTY_ORD, 
        ORD_DETAIL.CUMM_SHIPPED, 
        ORD_DETAIL.DISCOUNT, 
        ORD_DETAIL.UNIT_PRICE 
       FROM 
        ARCUSTO a, 
        ORDERS o, 
        ORD_DETAIL d, 
        ARINVT i 
       WHERE 
        a.ID = o.ARCUSTO_ID 
       AND 
        d.ORDERS_ID = o.ID 
      '); 

私はエラーを取得する:

ORA-00904: "ORD_DETAIL"."UNIT_PRICE": invalid identifier 

そして、私はからORD_DETAIL.UNIT_PRICEを削除しようとする場合select文の最後に、ORD_DETAIL.DISCOUNTが無効な識別子になりました。リストの最後の列が無効な識別子になります。接頭辞を削除してどのテーブルを決定すれば、列があいまいに定義されたエラーになります。

EDIT 1

私は今、次のようにコードを変更しました:

$view = oci_parse($conn, ' 
       CREATE OR REPLACE VIEW 
        V_ORD_HISTORY 
       AS 
       SELECT 
        a.ID as CUSTOMER_ID, 
        o.ID as ORD_ID, 
        o.PONO, 
        o.ORDERNO, 
        o.DATE_TAKEN, 
        o.ARCUSTO_ID, 
        d.ORDERS_ID, 
        d.ID as DETAIL_ID, 
        d.TOTAL_QTY_ORD, 
        d.CUMM_SHIPPED, 
        d.DISCOUNT, 
        d.UNIT_PRICE 
       FROM 
        ARCUSTO a, 
        ORDERS o, 
        ORD_DETAIL d, 
        ARINVT i 
       WHERE 
        CUSTOMER_ID = o.ARCUSTO_ID 
       AND 
        ORD_ID = d.ORDERS_ID 
      '); 

しかし、今ではORD_IDが無効の識別子であることを言っています。これは、SQLステートメントの最後の行です。

+2

を* * 'FROM'句にカンマを使用しないでください。 *常に、適切で明示的な 'JOIN'構文を使用します。 –

+1

テーブル名自体ではなく、 'ORD_DETAIL'テーブルに与えたエイリアス' d 'を持つ 'UNIT_PRICE'への参照を修飾します。その列への参照を表名で修飾する場合は、別名を削除します。クエリで参照されている他の列についても同じです。 –

+0

さて、私はほとんどそれを持っていると思う..上の編集#1を見てください。 –

答えて

1

どうしようについて:

CREATE OR REPLACE VIEW 
        V_ORD_HISTORY 
       AS 
       SELECT 
        a.ID as CUSTOMER_ID, 
        o.ID as ORD_ID, 
        o.PONO, 
        o.ORDERNO, 
        o.DATE_TAKEN, 
        o.ARCUSTO_ID, 
        d.ORDERS_ID, 
        d.ID as DETAIL_ID, 
        d.TOTAL_QTY_ORD, 
        d.CUMM_SHIPPED, 
        d.DISCOUNT, 
        d.UNIT_PRICE 
       FROM 
        ARCUSTO a, 
        ORDERS o, 
        ORD_DETAIL d, 
        ARINVT i 
       WHERE 
        a.id= o.ARCUSTO_ID 
       AND 
        o.id = d.ORDERS_ID 
+0

これはうまくいきました。しかし、私のビューには何らかの理由でデータがありませんが、データベースにデータがありますか? –

+0

これには2つの理由が考えられます。まず、結合しているテーブルのいずれかが空であるか、またはテーブルのデータがフィルタ基準で一致していないことがあります。あなたのデータをもう一度確認してください – XING

+0

テーブル 'arinvt'は、使用されていないので除外することをお勧めします。 – Moudiz

関連する問題