0

テーブルを結合するときに問題があります (左結合)

表1:

id1  amt1
1    100
2    200
3    300

表 2:

id2  amt2
1    150
2    250
2    350

私のクエリ:

select id1,amt1,id2,amt2 from table1
left join table2 on table2.id1=table1.id2

私の想定されるo / pは次のとおりです。

      id1 amt1  id2 amt2
row1: 1   100   1    150
row2: 2   200   2    250
row3: 2   200   2    350

私はrow3でo/pが欲しい

2 null 2 350

つまり、データ(amt1)の繰り返しを避けたい。

4

4 に答える 4

3

これは実際にはフォーマットの問題であり、クライアントが処理するのが最適です。たとえば、SQL*Plus ではBREAK...を使用できます。

SQL> select t1.*, t2.* from t1, t2
  2  /

A   B   C   D           C1
--- --- --- --- ----------
aaa bbb ccc ddd        111
aaa bbb ccc ddd        222

SQL> break on a on b on c on d
SQL> select t1.*, t2.* from t1, t2
  2  /

A   B   C   D           C1
--- --- --- --- ----------
aaa bbb ccc ddd        111
                       222

SQL>

注:これ以上の情報がないため、デカルト積を選択しました。

編集

BREAKは、行内の重複する列を抑制するSQL Plus コマンドです。SQL Plus クライアントでのみ機能します。ご想像のとおり、これは Oracle の SQL*Plus ユーザー ガイドで説明されています。 詳細をご覧ください。

私はBREAK物事を行う適切な方法の例として使用しました。なぜなら、それはクリーンで、関心の分離を正しく実装しているからです。別のクライアントを使用している場合は、そのフォーマット機能を使用する必要があります。SQL を微調整することは可能ですが (以下を参照)、重複した値を抑制したくない他の場所でクエリを再利用できないため、クエリの有用性が低下します。

ROW_NUMBER()とにかく、これはインライン ビューで分析関数を使用する 1 つのソリューションです。

SQL> select * from t1
  2  /

A   B   C   D           ID
--- --- --- --- ----------
eee fff ggg hhh          1
aaa bbb ccc ddd          2

SQL> select * from t2
  2  /

        C1         ID
---------- ----------
       333          2
       111          1
       222          2
       444          2

SQL> select t1_id
  2         , case when rn = 1 then a else null end as a
  3         , t2_id
  4         , c1
  5  from (
  6      select t1.id as t1_id
  7             , row_number () over (partition by t1.id order by t2.c1) as rn
  8             , t1.a
  9             , t2.c1
 10             , t2.id as t2_id
 11      from t1, t2
 12      where t1.id = t2.id
 13      )
 14  order by t1_id, rn
 15  /

     T1_ID A        T2_ID         C1
---------- --- ---------- ----------
         1 eee          1        111
         2 aaa          2        222
         2              2        333
         2              2        444

SQL>

を使用しないことにしましLAG()た。これは、固定オフセットでのみ機能し、T2 の行数が可変になる可能性が高いためです。

于 2009-09-22T13:19:27.537 に答える
0

すべてのデータを 1 行にまとめたい場合は、ユニオン選択を行うだけです...

tableA から fieldA を選択 ユニオン TableB から fieldB を選択

両方のテーブルで同じになるようにデータ型をキャストする必要があることに注意してください。

他の回答が必要な場合は、期待される結果をより適切にフォーマットしてください;)

Ok...

フォーマットを修正しました...

上記の場合、クエリから 2 つのカーソルを返すだけです。サンプル データには、両方のテーブルをリンクするためのフィールドが用意されていないため、合理的な方法でそれらを結合する方法がわかりません。sproc が複数の結果セットを返す可能性があります。

于 2009-09-22T13:09:06.217 に答える
0

結合基準を指定していないため、2 つのテーブルのデカルト積を計算しました。重複を排除するには、テーブルを結合する方法を指定する必要があります。

たとえば、次のように試すことができます

select * from table1, table2 where table2.val = 111;

あなたの例には結合キーがないため、テーブルを結合するための明らかな値はありません。ただし、より典型的な例として、意味のある方法でそれらを結合できるように、両方のテーブルに関連する値があるとします。

于 2009-09-22T13:10:56.243 に答える
0

ここでクロス結合を行っているようです。等結合または左外部結合のいずれかが必要だったのではないかと思います。

于 2009-09-22T13:16:57.260 に答える