2016-12-23 12 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

* Никогда * используйте запятые в 'п от'. * Всегда * используйте правильный, явный синтаксис 'JOIN'. –

+1

Подтвердите ссылку на 'UNIT_PRICE' с псевдонимом' d', который вы указали в таблице 'ORD_DETAIL', а не с самим именем таблицы. Если вы хотите получить ссылку на этот столбец с именем таблицы, удалите псевдоним. То же самое касается любого другого столбца, на который ссылается ваш запрос. –

+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