2

Visual Studioのクエリツールで実行しているクエリがあり、次のエラーが発生します。

ORA-00972:識別子が長すぎます。

オラクルには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」がビューであることを考慮に入れてください。

track = '104490'は、テスト目的の単なるサンプル整数です。私はさまざまな解決策を試みましたが、正しい方法(または正しい方法を探すこと)は私を逃しているようです。

心から、私。

PSこれがばかげた質問なら申し訳ありません。

編集:

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」は無効な識別子になりました。すぐにこれに戻ります。間違った方法でエイリアシングしていると思いますが、よくわかりません。調べてみてください。

EDIT2:

  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にカウントされる可能性があります。これをまだ理解しようとすると、グーグルは命名のヒントを返します:成功しません。まだ検索しています。

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 / solution?

奇妙なことに、これはうまくいくようです。

    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';
4

3 に答える 3

2

table.column 全体を二重引用符で囲んでいます。

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'
于 2013-01-08T15:46:16.133 に答える
2

引用符が間違っています。「cef_tsroma.tsrido」は「cef_tsroma」.「tsrido」...

edit2 の場合: 新しい名前 (エイリアス) はWHEREorJOIN句では有効ではありません。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 では大文字で格納されますが、クエリでは小文字、大文字、または任意の組み合わせで使用できます。

テーブルまたは列の名前を二重引用符で囲むと、これが突然変わります。次に、オラクルは正確にそのスペルを主張します。

したがって、あなたの場合、テーブル/ビュー"cef_tsroma"は存在しませんが、またはcef_tsroma存在します...CEF_TSROMA"CEF_TSROMA"

于 2013-01-08T15:46:41.533 に答える
1

テーブルでエイリアスを使用してみましたか:

 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'
于 2013-01-08T15:47:33.937 に答える