1

私は、あまりうまく書かれていないいくつかのレガシー SQL を扱っています。ほとんどの場合、期待する結果を生成するように見えるあいまいな選択がありますが、常にではありません。

これが私が話していることの簡単な例です:

create table T1(
  A                 VARCHAR2(10),
  B                 VARCHAR2(10),
  C                 VARCHAR2(10),
  D                 VARCHAR2(10)
  )

create table T2(
  A                 VARCHAR2(10),
  B                 VARCHAR2(10)
  )

insert into T1(A, B, C, D)
values ('AA', 'BB', 'CC', 'DD' )

insert into T2(A, B)
values ('Y', 'N' )

使用されているクエリを除いて、これまでのところ異常なことはありません...

  SELECT * FROM T1, T2 WHERE T2.A ='Y'

    A B   C   D   A_1 B_1
    AA    BB  CC  DD  Y   N


  SELECT * FROM T2, T1 WHERE T2.A ='Y'

    A B   A_1 B_1 C   D
    Y N   AA  BB  CC  DD

これは明らかにあいまいであり、Oracle は必要に応じて接尾辞 _1 を使用して列を再指定することで、私たちを助けようとしています。オラクルがこれを別の方法で処理する状況はありますか? たとえば、異なるバージョンなど。

たとえば、最初のクエリでは、フィールド A の値は「AA」ですが、同じクエリでフィールド A が「Y」に設定される場合がありますか?

既存のコード ベースにはこの種のものがいたるところにあり、修正する必要があります。今のところ、これがどれほど深刻な問題であるかを評価しようとしています。私は主に、異なる Oracle バージョンに対して実行された同じ SQL が異なる結果をもたらす可能性があることを懸念しています。

ありがとうございました!

編集:明確にするために、計画はクエリを明確にすることです。今のところ問題は、Oracle のさまざまなバージョンがこれをどのように処理するかということです。

4

1 に答える 1

2

可能であれば、コードを調べて列名とエイリアスを明示的に設定し、列インデックスで結果セットにアクセスするすべてのコードにも同じことを行う必要があります。以下のリンクの回答は、現在の状況にどれほど不快感を抱くべきかを示しています。

select * と select 列

もちろん、「壊れていないなら直すな」と言う開発者のリードも知っていますが、あなたはそうではありませんよね?

于 2012-01-17T22:26:56.410 に答える