0

やや紛らわしいタイトルで申し訳ありませんが、タイトル行で簡潔に説明したり、適切な検索文字列を思いついたりするのが難しいため、質問に対する答えを見つけるのに苦労しています. Anyhoooo、ここに私が直面している問題があります:

質問の短いバージョンは次のとおりです。Oracleが理解する有効なSQLで、次の(無効だが理解可能なSQL)をどのように記述できますか?

select B.REPLACER as COL, A.* except A.COL from A join B on a.COL = B.COL;

これが長いバージョンです(短いバージョンを読んで私が何を望んでいるかをすでに知っているなら、これを読む必要はありません:P ):

私の (簡略化された) タスクは、テーブルのデータを処理し、それをサブクエリとして提供するサービスを考え出すことです。テーブルには多くの列 (数十以上) があり、すべての列を 1 つずつ明示的にリストするのではなく、「select *」を使用することに固執しています。ただし、下流のシステムはそれを認識し、それに応じて調整します。

たとえば、このテーブル (以降、テーブル A と呼びます) には「COL」という列があり、その COL の値を、2 つの COL 値が一致するテーブル B の REPLACER 列の値に置き換える必要があります。

どうすればいいですか?下流のシステムが「COL」を想定しているため、列の名前を変更できません。「expect A.COL」の部分なしではできません。SQLがあいまいになるからです。

あなたの助けに感謝します、全能のStackOverflow

レイ

4

4 に答える 4

2

table.*またはのいずれかを使用できますtable.fieldName

に使用できる構文はありませんtable.* (except field X)

これは、すべてのフィールドを明示的にリストすることによって、必要なものだけを取得できることを意味します...

select
  A.field1,
  A.field2,
  B.field3,
  A.field4,
  etc
from
  A join B on a.COL = B.COL;

これは、新しいフィールドを取得し続けないように、データを再モデル化する必要がある場合があることを意味します。 OR動的SQLを書く. データベースに問い合わせて列名を見つけ、コードを使用して上記のようにクエリを記述し、動的に生成されたクエリを実行します。

于 2012-06-28T08:52:52.817 に答える
0

最初の原則から始めましょう。 select * from ....発生するのを待っているバグであり、本番コードにはありません。もちろん、タイピングが少ないので誰もがそれを使用しますが、それは良い習慣にはなりません。

それを超えて、ANSISQL標準は select * except col1 from ....構文をサポートしていません。多くの人がそれを望んでいることを私は知っていますが、そうではありません。

過度の入力を避ける方法はいくつかあります。1つは、USER_TAB_COLUMNSなどのビューの1つを使用して、データディクショナリから選択してクエリを生成することです。このようなクエリがたくさん必要な場合は、これを行うためにPL?SQLブロックを作成する価値があります。

より簡単なハックは、SQL*Plusを使用してdescribeテーブルAの構造を一覧表示することです。正規表現をサポートするIDEにカットアンドペーストし、列を編集してクエリの投影を提供します。

これらのオプションはどちらも面倒だと思われるかもしれませんが、率直に言って、どちらの回避策(特に2番目の回避策)でも、StackOverflowに問い合わせるよりも手間がかかりません。次回はもっとよくわかるでしょう。

于 2012-06-28T09:30:42.993 に答える
0

これを試してください:(テストされていません)

select Case B.COL
       when null then A.COL
       else B.REPLACER
       end as COLAB, A.*
from A left join B on A.COL = B.COL;

B.COL = A.COL が存在する場合、これは B.REPLACER を取得する必要があります。select にさらに列を追加するか (サンプル col1、col2 など)、A.* を使用します (COL を COLAB に変更して、A.COL と区別できるようにします)。 A.*) で。

于 2012-06-28T08:43:57.060 に答える