14

私はテーブルを持っています

表1

col1    col2    
a       b
c       d

とテーブル2

mycol1  mycol2
e           f
g           h
i           j
k           l

共通フィールドを持たない 2 つのテーブルを、次のような 1 つのテーブルに結合したいと考えています。

表 3

col1    col2    mycol1  mycol2
a           b   e   f
c           d   g   h
null    null    i   j
null    null    k   l

つまり、2 つのテーブルを並べて配置するようなものです。

私は立ち往生しています!助けてください!

4

3 に答える 3

16

各テーブルの各行の行番号を取得し、それらの行番号を使用して完全結合を実行します。

WITH CTE1 AS
(
    SELECT ROW_NUMBER() OVER(ORDER BY col1) AS ROWNUM, * FROM Table1
),
CTE2 AS
(
    SELECT ROW_NUMBER() OVER (ORDER BY mycol1) AS ROWNUM, * FROM Table2
)
SELECT col1, col2, mycol1, mycol2
FROM CTE1 FULL JOIN CTE2 ON CTE1.ROWNUM = CTE2.ROWNUM

これは、SQL Server >= 2005 を想定しています。

于 2013-07-18T14:22:07.973 に答える
2

なぜこの問題を解決する必要があるのか​​を説明していただけると大変助かります。SQL構文を練習するだけだと思いますか?

とにかく、行にはそれらを接続するものがないため、接続を作成する必要があります。私はそれらの値の順序を選択しました。また、それらには何も接続されていないため、そもそもなぜそれらを隣り合わせに配置したいのかという疑問も生じます.

完全なソリューションは次のとおりです。http://sqlfiddle.com/#!6/67e4c/1

選択コードは次のようになります。

WITH rankedt1 AS
(
  SELECT col1
  ,col2
  ,row_number() OVER (order by col1,col2) AS rn1
  FROM table1
  )
,rankedt2 AS 
(
  SELECT mycol1
  ,mycol2
  ,row_number() OVER (order by mycol1,mycol2) AS rn2
  FROM table2
  )

SELECT
col1,col2,mycol1,mycol2
FROM rankedt1
FULL OUTER JOIN rankedt2
  ON rn1=rn2
于 2013-07-18T14:29:32.857 に答える
2

オプション 1: 単一クエリ

2 つのテーブルを結合する必要あり、table1 の各行を table2 の 1 つの行だけに一致させたい場合は、何らかの方法で結合を制限する必要があります。各テーブルの行番号を計算し、その列で結合します。行番号はデータベース固有です。これがmysqlの解決策です:

SELECT
    t1.col1, t1.col2, t2.mycol1, t2.mycol2
FROM
    (SELECT col1, col2, @t1_row := t1_row + 1 AS rownum FROM table1, (SELECT @t1_row := 0) AS r1) AS t1
    LEFT JOIN
    (SELECT mycol1, mycol2, @t2_row := t2_row + 1 AS rownum FROM table2, (SELECT @t2_row := 0) AS r2) AS t2
    ON t1.rownum = t2.rownum;

これは、table1 が table2 よりも長いことを前提としています。table2 が長い場合RIGHT JOINは、t1 および t2 サブセレクトの順序を使用または切り替えます。ORDER BYまた、副選択の句を使用して、各テーブルの順序を個別に指定できることにも注意してください。

( mysql のインクリメント カウンターの選択を参照)

オプション 2: 後処理

2 つの選択を行ってから、お気に入りのスクリプト言語で結果を連結することを検討してください。これは、はるかに合理的なアプローチです。

于 2013-07-18T15:28:03.887 に答える