4

私は2つのSQLクエリを持っています。これにより、行数が異なる2つのテーブルが得られます。それらを結合する必要があります-2つのテーブルを一緒に表示するためだけに相互に

表1

  row1      row2
  ==============
  12        gfd
  13        jf
  14        gfd
  15        jhhh

表 2

  row3      row4
  ==============
  18    gjkd
  11    jfyty

結果

row1    row2     row3         row4
======================================
  12    gfd      18           gjkd
  13    jf       11           jfyty
  14    gfd     
  15    jhhh        

各テーブルのデータは完全に異なり、フィールド名も異なります。私はOracle DBを使用しています。クエリはiReportで使用する必要があります。

4

4 に答える 4

2

各テーブルの行の順序で 2 つのテーブルを結合したいようです。申し訳ありませんが、SQL にはテーブル内の行の暗黙的な順序の概念がなく、JOIN を許可する列なしで 2 つ (またはそれ以上) のテーブルの列を連結する方法が SQL にはありません。

SQL で達成できる最も近いものは次のとおりです。

  • CROSS JOIN2つのテーブルの間。これにより、table1 の各行が table2 の各行に繰り返されます。
SELECT t1.row1, t1.row2, t2.row3, t2.row4
FROM table1 t1
CROSS JOIN table1 t2
-- row1  row2    row3  row4
-- ----  ------  ----  ------
--   12  gfd     18    gjkd
--   13  jf      18    gjkd
--   14  gfd     18    gjkd
--   15  jhhh    18    gjkd
--   12  gfd     11    jfyty
--   13  jf      11    jfyty
--   14  gfd     11    jfyty
--   15  jhhh    11    jfyty
  • 別の(補助)列を作成し、各テーブルに行の「順序」を保存します(カーソル、シーケンスなどを使用してそれを行う方法はたくさんあります...)。次に、それらの列を使用して次を構築しますOUTER JOIN
SELECT t1.auxOrder1, t1.row1, t1.row2, t2.auxOrder2, t2.row3, t2.row4
FROM table1 t1
LEFT OUTER JOIN table1 t2 ON (t1.auxOrder1 = t2.auxOrder2)
-- auxOrder1 row1  row2    auxOrder2 row3  row4
-- --------- ----  ------  --------- ----  ------
--         1   12  gfd             1   18    gjkd
--         2   13  jf              2   11    jfyty
--         3   14  gfd
--         4   15  jhhh

ところで、なぜ「row1」、「row2」などの名前の列を作成したのですか? 意図されていない場合、混乱を招く可能性があると思います。

于 2012-10-10T08:34:40.087 に答える
0

結合を行うときに値を繰り返すのではなく、2 つのテーブルから一意の名前と住所の値を表示するために、このクエリは両方のテーブルから一意の値を取得し、それらを順番に表示します。

これは、Oracle 11 を使用して実行できたことです。

select name, address,  table1_id, table2_id 
from 
(
    select table1_id, name,  table_id||(row_number () over (partition by table_id order by name desc nulls last)) as  table1_id_row
    from 
    (
        select distinct table_id table1_id, name
        from table1
        where table_id is not null 
    ) 
) 
FULL OUTER JOIN 
(
    select table2_id, address,   table_id||(row_number () over (partition by table_id order by address desc nulls last)) as  table2_id_row
    from 
    (
        select distinct table_id table2_id, address, city, state, zip
        from table2
        where table_id is not null
    )
) 
ON table1_id_row = table2_id_row
where table1_id = '123456789' or table2_id = '123456789'
于 2016-12-15T11:44:29.363 に答える