2017-03-09 6 views
0

全く異なるカラムを持つ2つのテーブルがあります。たとえば、次のように彼らの独立したデータ列を維持するが、して結果を注文する共通の値をキャストする単一の結果セットを返す方法があるかどう別個のテーブルと共通フィールドからのMySQL結果

A:      B: 
+-----+-------+------+ +------+------+-------+-------+ 
| id | price | name | | key | cost | title | color | 
+-----+-------+------+ +-----+-------+-------+-------+ 
| 123 | 10.00 | Boat | | 456 | 12.00 | Ship | red | 
+-----+-------+------+ +-----+-------+-------+-------+ 
| 124 | 8.00 | Car | | 457 | 5.00 | Truck | blue | 
+-----+-------+------+ +-----+-------+-------+-------+ 

私は思ったんだけど。例えば、コスト/価格で発注:私はJOINをしたくない、とUNIONのための任意の共通の列が存在しないので

[1] key = 456 cost = 12.00 title = Ship color = red 
[2] id = 123 price = 10.00 name = Boat 
[3] id = 124 price = 8.00 name = Car 
[4] key = 457 cost = 5.00 title = Truck color = blue 

、このような何かを行うにはとにかくはありますか?

EDIT:

私は私の実際のシナリオでは、テーブルはより多くの列が含まれていることに注意してください。連合では、明示的にそれらの列を互いにマップしなければならないように思えます。列の数を考えると、理想的ではない...

+2

'UNION'では、共通の列名は必要なく、同じ数の列のみが必要です。 'UNION'の半分のカラムエイリアスを使って同じ名前を付けることができますが、そうでない場合でも' UNION'の上半分からカラムの名前で注文できます。 –

+0

@MichaelBerkowski私の実際のシナリオでは、1つのテーブルの方が他のテーブルよりはるかに少ない数のカラムしか持っていません。私はこの矛盾をどのように扱いますか? – HWD

+0

私に「UNION ALL」操作のように見えます。再集合が実際にどのように見えるかははっきりしません。大カッコで囲まれた行番号が必要ですか? 'key ='、 'price =' et al。リテラル?各問合せでは、同じデータ型を使用して同じ数の列を戻すだけです。いずれかのクエリに「欠落」列がある場合は、SELECTにプレースホルダリテラルを追加するだけです。 – spencer7593

答えて

0

すべてのフィールドは実際には共通ですKey/IDprice/costは両方とも数字ですtitle/nameは両方とも文字列です。

私はここで唯一の解決策は、互いにかなりcost/priceよりも、より一般的なエイリアス名を使用して、title/nameに一致するように、列名にUNIONオペレータとエイリアスを使用することであると思うだろう。

1

単一の結果セットが返されるようにするには、UNION ALLの2つのクエリの集合演算を使用できます。列の数と列のデータ型は一致する必要があります。リテラルを含む任意の式を使用できます。

SELECT v.* 
    FROM (SELECT 'key = ' AS col1 
       , b.key  AS col2 
       , 'cost = ' AS col3 
       , b.cost  AS col4 
       , 'title = ' AS col5 
       , b.title  AS col6 
       , 'color =' AS col7 
       , b.color  AS col8 
      FROM B b 
      UNION ALL 
     SELECT 'id = '  AS col1 
       , a.id  AS col2 
       , 'price = ' AS col3 
       , a.price  AS col4 
       , 'name = ' AS col5 
       , a.name  AS col6 
       , ''   AS col7 
       , ''   AS col8 
      FROM A a 
     ) v 
    ORDER BY v.col4 DESC 

よくUNION ALL結果、このタイプで、我々は、クエリが弁別が一般的なパターンであるように、追加の列を含む行を返され興味を持っています。

それはAから

注行のBからの行の'key ='、および'id ='を含んでいますので、私はこの例では、我々はAの「行方不明」の列に、私達はちょうど使用していること、col1を使用することができますが含まcol7とcol8の値を返すためにSELECTリストのプレースホルダリテラルを使用すると、列とデータ型の数が一致します。

関連する問題