ORA-00972: Слишком длинный идентификатор

У меня есть запрос, который я выполняю в инструменте запросов Visual Studio, и я получаю следующую ошибку.

ORA-00972: слишком длинный идентификатор.

Теперь я считаю, что знаю, что oracle имеет ограничение в 30 байт, но это тот запрос, который я пытаюсь выполнить.

   select 
          "cef_tsroma.tsrido" as "truck", 
          "cef_tsroma.dosvlg" as "rideNumber",
          "cef_v_cw_shipment.shipmentNumber" as "shipmentNumber"
   from 
          "cef_tsroma" left outer join "cef_v_cw_shipment" on "rideNumber" = "shipmentNumber"
   where 
          "truck" = '104490'

К сожалению, я не смогу изменить саму структуру базы данных, так как ею управляет другая компания, которая ничего не знает о нормализации базы данных или находится в ситуации, когда они просто не могут или не должны. Я не знаю. Примите во внимание, что "cef_v_cw_shipment" - это представление.

truck = '104490' - это всего лишь пример целого числа для целей тестирования. Я пробовал различные решения, но правильный метод (или поиск правильного метода), кажется, ускользает от меня.

С уважением, я.

P.S. Извините, если это глупый вопрос.

Редактировать:

select 
      "cef_tsroma"."tsrido" as "truck", 
      "cef_tsroma"."dosvlg" as "rideNumber",
      "cef_v_cw_shipment"."shipmentNumber" as "shipmentNumber"
from 
      "cef_tsroma" left outer join "cef_v_cw_shipment" on "rideNumber" = "shipmentNumber"
 where 
      "truck" = '104490'

rideNumber - теперь недопустимый идентификатор, я к этому скоро вернусь. Я думаю, что я неправильно использовал псевдоним, но я не уверен. Пойди, чтобы узнать.

РЕДАКТИРОВАТЬ2:

  select 
  ct.tsrido as "truck", 
  ct.dosvlg as "rideNumber",
  cs.shipmentNumber as "shipmentNumber"
  from  "cef_tsroma" ct
  left outer join "cef_v_cw_shipment" cs
  on "rideNumber" = "shipmentNumber"
  where  "truck" = '104490'

Сейчас я использую этот синтаксис, поскольку он намного чище и легче для понимания, чем предыдущий. Однако я все еще сталкиваюсь с ORA-00904: "rideNumber": недопустимый идентификатор (вероятно, это также учитывается и для shipmentNumber в строке соединения. Пытаясь понять это, Google возвращает подсказки по именованию: безуспешно. Все еще поиск.

Edit3:

    select
            ct.tsrido as truck, 
            ct.dosvlg as rideNumber,
            cs.shipmentNumber as shipment
    from
            "cef_tsroma" ct
    left outer join 
            "cef_v_cw_shipment" cs 
    on 
            ct.dosvlg = cs.shipmentNumber
    where  
            truck = '104490'

Теперь, следуя предложениям, это текущий синтаксис. В настоящее время он возвращает сообщение об ошибке:

ОШИБКА ORA-00904: "CS". "SHIPMENTNUMBER": недопустимый идентификатор.

Извините, я не проектировал эту базу данных>):

Edit4 / решение?

Как ни странно, это вроде работает.

    select ct."tsrido", ct."dosvlg", cs."shipmentNumber" as shipmentnumber
    from "cef_tsroma" ct 
    left outer join "cef_v_cw_shipment" cs 
    on ct."dosvlg" = cs."shipmentNumber" 
    where ct."tsrido" = '104956';

person Perfection    schedule 08.01.2013    source источник
comment
Вы должны использовать исходное имя, а не псевдоним в предложении JOIN: ... ON "cef_tsroma"."dosvlg" = "cef_v_cv_shipment"."shipmentNumber"   -  person wolφi    schedule 08.01.2013
comment
Я пытался это сделать, но это тоже не работает. ОШИБКА ORA-00904: cef_v_cv_shipment.shipmentNumber: недопустимый идентификатор   -  person Perfection    schedule 08.01.2013
comment
Для псевдонимов таблиц ct и cs синтаксис соединения - ON ct.dosvlg = cs.shipmentNumber.   -  person wolφi    schedule 08.01.2013
comment
См. Edit3, все равно выдает ошибку.   -  person Perfection    schedule 08.01.2013
comment
О, Боже! Не могли бы вы запросить правильное написание названий таблиц и столбцов, пожалуйста? SELECT table_name, column_name FROM user_tab_columns WHERE UPPER(table_name) IN ('CEF_TSROMA','CEF_V_CW_SHIPMENT');   -  person wolφi    schedule 08.01.2013
comment
TABLE_NAME COLUMN_NAME cef_tsroma dosvlg TABLE_NAME COLUMN_NAME cef_tsroma tsrido TABLE_NAME COLUMN_NAME cef_v_cw_shipment shipmentNumber   -  person Perfection    schedule 08.01.2013
comment
Спасибо! Отредактирую ответ соответственно ...   -  person wolφi    schedule 08.01.2013
comment
Извини, это моя вина. Ваш результат запроса user_tab_columns говорит, что таблица называется cef_tsroma, поэтому вам, конечно же, нужны кавычки! Ваше решение "cef_tsroma" абсолютно правильное, цитаты необходимы. Извините за то, что не дал правильный ответ сразу!   -  person wolφi    schedule 09.01.2013


Ответы (3)


Цитаты неверны. "cef_tsroma.tsrido" должно быть "cef_tsroma". "tsrido" ...

На edit2: новые имена (псевдонимы) не влияют на предложения WHERE или JOIN. Чтобы использовать пример, столбец X таблицы DUAL можно переименовать, но он должен быть адресован старым именем в предложении WHERE:

SELECT dummy AS "myNewName" FROM dual WHERE "myNewName" = 'X';
-- ORA-00904: "myNewName": invalid identifier

SELECT dummy AS "myNewName" FROM dual WHERE dummy = 'X';
-- X

На edit3: имена ваших таблиц и столбцов выглядят как обычные имена Oracle, которые нечувствительны к регистру. Таким образом, вы можете удалить все двойные кавычки:

select ct.tsrido         as truck,
       ct.dosvlg         as ridenumber,
       cs.shipmentNumber as shipmentnumber
  from cef_tsroma              ct 
  left join cef_v_cw_shipment  cs on ct.dosvlg = cs.shipmentnumber
 where ct.truck = '104490';

Чтобы объяснить более подробно: имена таблиц и столбцов Oracle обычно нечувствительны к регистру. Oracle хранит их в верхнем регистре, но вы можете использовать их в нижнем, верхнем регистре или в любой комбинации в запросе.

Это резко изменится, если вы заключите имя таблицы или столбца в двойные кавычки. Тогда Oracle настаивает именно на этом написании.

Итак, в вашем случае таблица / представление "cef_tsroma" не существует, но cef_tsroma или CEF_TSROMA или "CEF_TSROMA" есть ...

person wolφi    schedule 08.01.2013
comment
А также "cef_v_cw_shipment.shipmentNumber" - person a_horse_with_no_name; 08.01.2013
comment
В этом коде говорится, что не удалось найти таблицу или представление. - person Perfection; 09.01.2013
comment
Кажется, работает следующее. Спасибо. выберите ct.tsrido, ct.dosvlg, cs.shipmentNumber в качестве номера отгрузки из cef_tsroma ct левого внешнего соединения cef_v_cw_shipment cs на ct.dosvlg = cs.shipmentNumber, где ct.tsrido = '104956'; - person Perfection; 09.01.2013

вы заключаете всю таблицу. столбец в двойные кавычки.

select 
          "cef_tsroma"."tsrido" as "truck", 
          "cef_tsroma"."dosvlg" as "rideNumber",
          "cef_v_cw_shipment"."shipmentNumber" as "shipmentNumber"
from 
          "cef_tsroma" left outer join "cef_v_cw_shipment" on "rideNumber" = "shipmentNumber"
where 
          "truck" = '104490'
person John Woo    schedule 08.01.2013

Вы пробовали использовать псевдонимы для таблиц:

 select ct.tsrido as truck, 
      ct.dosvlg as rideNumber,
      cs.shipmentNumber as shipmentNumber
 from  cef_tsroma ct
 left outer join cef_v_cw_shipment cs
    on ct.dosvlg = cs.shipmentNumber
  where ct.tsrido = '104490'
person Taryn    schedule 08.01.2013
comment
Спасибо за помощь людям, указанным выше. Это тоже полезно для меня. Однако он возвращает ту же ошибку. ОШИБКА ORA-00904: rideNumber: недопустимый идентификатор. - person Perfection; 08.01.2013
comment
@davide, если убрать кавычки вокруг псевдонимов, это работает? - person Taryn; 08.01.2013
comment
если я уберу кавычки вокруг всех псевдонимов, то вместо этого будет выдана та же ошибка только для shipmentNumber (или сначала). выберите ct.tsrido как грузовик, ct.dosvlg как rideNumber, cs.shipmentNumber как shipmentNumber из cef_tsroma ct левое внешнее соединение cef_v_cw_shipment cs на rideNumber = shipmentNumber, где truck = '104490' возвращает ОШИБКУ ORA-00904: rideNumber: недопустимый идентификатор - person Perfection; 08.01.2013
comment
@davide удаляет псевдоним ridenumber из соединения и использует фактическое имя столбца. Вы не можете использовать псевдоним из списка выбора в объединении. - person Taryn; 08.01.2013
comment
См. Edit3, он все равно возвращает ошибку. ОШИБКА ORA-00904: CS.SHIPMENTNUMBER: недопустимый идентификатор. - person Perfection; 08.01.2013