2013-07-12 8 views
5

2つのテーブルをマージする方法に関するSQLの回答を探しています。sqlのマージテーブルが並行して並んでいない

So let's say you have these two tables without anything in common: 

Guys    Girls 
id name   id name 
--- ------  ---- ------ 
1  abraham  5 sarah 
2  isaak   6 rachel 
3  jacob   7 rebeka 
        8 leah 

and you want to merge them side-by-side like this: 

Couples 

id name  id name 
--- ------ --- ------ 
1 abraham 5 sarah 
2 isaak  6 rachel 
3 jacob  7 rebeka 
       8 leah 

How can this be done? 

私は何も共通することなく2つのテーブルをマージする方法に関するSQLの答えを探しています。

+1

をTBL_PERIODS私はいくつかのアイデアを持っていますが、どちらが正しいものは、あなたがここで達成しようとしているかに依存しています。このように一緒に投げ込んだだけでは、何も役に立たないでしょう。文脈を知ることは、最良の行動方針を決定するのに役立ちます。それをどのようにマッチさせるかについてのあなたの頭にはいくつかの論理がなければなりません。トリックはそれをDBに取り込みます。あなたの例では、カップルを作るためにボーイフレンド/ガールフレンドとマッチングしていますか? – David

+2

私の質問はDavid Strattonの懐疑的な質問と同じですが、もう少し鈍っています。なぜそうしたいのですか? – mikeY

+0

私はこれを二番目に....なぜですか? – Charleh

答えて

11

これは、行番号であるキーを作成して結合することで実行できます。

SQLのほとんどの方言はrow_number()機能をサポートしています。これを使用するアプローチは次のとおりです。

select gu.id, gu.name, gi.id, gi.name 
from (select g.*, row_number() over (order by id) as seqnum 
     from guys g 
    ) gu full outer join 
    (select g.*, row_number() over (order by id) as seqnum 
     from girls g 
    ) gi 
    on gu.seqnum = gi.seqnum; 
+0

ありがとうございました!これは私が探していたものでした。 – Mike

2

通常はあなたが別のテーブルでこれを行うだろう...あなたはあなたの例では女の子と男を一致させる、および記録(しゃれが意図していない)との有意義な関係のいくつかの並べ替えを持っていたい、

を想定すると、両者間の関連性(関係性)を表す。

enter image description here

これは、あなたの物理的なテーブルを与えないだろうが、それは最終結果を表すSQLクエリを記述することができますでしょう:あなたは、テーブルを作成するために使用することができ

SELECT  Girls.ID AS GirlId, Girls.Name AS GirlName, Guys.ID AS GuyId, Guys.Name AS GuyName 
FROM   Couples INNER JOIN 
      Girls ON Couples.GirlId = Girls.ID INNER JOIN 
      Guys ON Couples.GuyId = Guys.ID 

Select Intoの構文を使用してその場で

SELECT  Girls.ID AS GirlId, Girls.Name AS GirlName, Guys.ID AS GuyId, Guys.Name AS GuyName 
    INTO MyNewTable 
    FROM   Couples INNER JOIN 
       Girls ON Couples.GirlId = Girls.ID INNER JOIN 
       Guys ON Couples.GuyId = Guys.ID 

(ただし、標準正規化ルールは、それが明確なトンでそれらを保つために最善だと言うでしょうパフォーマンスの理由がない限り、テンポラリテーブルを作成するのではなく、テーブルを作成する必要があります)。

2

とにかく私はそれを書いています。代わりにCTEを使用しています。

WITH guys2 AS (SELECT id,name,ROW_NUMBER() OVER (ORDER BY id) rn FROM guys), 
    girls2 AS (SELECT id,name,ROW_NUMBER() OVER (ORDER BY id) rn FROM girls) 
SELECT guys2.id guyid, guys2.name guyname, 
     girls2.id girlid, girls2.name girlname 
FROM guys2 FULL OUTER JOIN girls2 ON guys2.rn = girls2.rn 
ORDER BY COALESCE(guys2.rn, girls2.rn); 

An SQLfiddle to test with

+0

また動作します。ありがとう! – Mike

+0

便利なツールもあります。ありがとうございました! – Mike

-1

私はこれをいつも必要としています - 私のテーブルからの入力を使ってExcelでテンプレートを作成する。これは、私の地域があるテーブルと、1年で四半期があるテーブルから引き出されます。その結果、四半期ごとに1つの地域名が与えられます。

SELECT b.quarter_qty、TBL_MKTS FROM a.mkt_name、B

+0

新しい質問がある場合は、[新しい質問をする] –

+0

いいえ、これは表aとbのデカルト積を返します。 – giorgioca

関連する問題