2

私はdbクエリのコーディングが初めてで、2つのテーブルを1つにマージする方法を見つけるためにいくつかのGoogleを実行しましたが、INNER JOINとUNION ALLは必要なことを正確に行っていません。

2 つのまったく異なるテーブルがあり、1 つに並べて表示したい

ここに私が持っているものがあります:

+-----------+  +------------+
| ids type  |  | d1  d2  d3 |
+-----------+  +------------+
| 1   01    |  | 45  13  4  |
| 2   02    |  | 46  14  4  |
| 3   03    |  | 47  15  4  |
+-----------+  | 48  16  4  |
               +------------+

そして、私はこれを取得したい:

+-----------------------+
| ids  type  d1  d2  d3 |
+-----------------------+
| 1    01    45  13  4  |
| 2    02    46  14  4  |
| 3    03    47  15  4  |
| NULL NULL  48  16  4  |
+-----------------------+
4

2 に答える 2

3

あなたが抱えている問題は、テーブルに参加するためのケがないことです. 適切なデータベースを使用していると仮定すると、 を使用してデータベースを生成できますrow_number()ids最初のテーブルの順序はで、2 番目のテーブルの順序は であると仮定しd1ます。

select t1.ids, t1.type, t2.d1, t2.d2, t2.d3
from (select t1.*, row_number() over (order by ids) as seqnum
      from t1
     ) t1 full outer join
     (select t2.*, row_number() over (order by d1) as seqnum
      from t2
     ) t2
     on t1.seqnum = t2.seqnum

これが行っているのは、各テーブルに連続番号を割り当て、それを結合に使用することです。

于 2013-02-23T16:36:21.873 に答える
0

を使用したいくつかの CTE の 1 つの方法を次に示しROW_NUMBERます。

with cte1 as (
  select ids, type, ROW_NUMBER() OVER (ORDER BY ids) rn
  from table1 
  ), cte2 as (
  select d1, d2, d3, ROW_NUMBER() OVER (ORDER BY d1) rn
  from table2 
  ) 
select t1.ids, t1.type, t2.d1, t2.d2, t2.d3
from cte1 t1 
  left join cte2 t2 on t1.rn=t2.rn
union 
select t1.ids, t1.type, t2.d1, t2.d2, t2.d3
from cte2 t2 
  left join cte1 t1 on t1.rn=t2.rn
where t1.ids is null

サンプル Fiddle デモ

于 2013-02-23T16:40:05.973 に答える