質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

65819閲覧

[sql]2つのselect文を横に結合したい

coinbura

総合スコア106

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2018/08/19 11:09

編集2018/08/19 11:18

MySQLのselect文を使って以下のような出力を得る「select文出力A」と「select文出力B」があります。

select文出力A
+-------+------------+
| EmpID | FullName |
+-------+------------+
| A001 | 太郎 |
| A002 | 花子 |
| A003 | 五郎 |
| A004 | 三郎 |
+-------+------------+

select文出力B
+-------+-----+
| EmpID | Age |
+-------+-----+
| A001 | 31 |
| A002 | 35 |
| A003 | 56 |
| A004 | 22 |
+-------+-----+

この2つのSQL文を1つの出力にしたく、以下のようにしました。

(select文出力A) union (select文出力B)

(↓「select文出力A」と「select文出力B」の内容も含めた全文)

(SELECT `EmpID`,meta_value as "FullName" FROM `wp_usermeta` where `meta_key` = "FullName") union (SELECT `EmpID`,meta_value as "Age" FROM `wp_usermeta` where `meta_key` = "Age")

すると、結果は以下になりました。

+-------+------------+
| EmpID | FullName |
+-------+------------+
| A001 | 太郎 |
| A002 | 花子 |
| A003 | 五郎 |
| A004 | 三郎 |
| A001 | 31 |
| A002 | 35 |
| A003 | 56 |
| A004 | 22 |
+-------+------------+

これを以下のように、横に結合する為にはどのようなSQLを書けば良いのでしょうか?
+-------+------------+------+
| EmpID | FullName | Age |
+-------+------------+------+
| A001 | 太郎 | 31 |
| A002 | 花子 | 35 |
| A003 | 五郎 | 56 |
| A004 | 三郎 | 22 |
+-------+------------+------+

ちなみにテーブル「wp_usermeta」はこんな感じになっています。(WordPressのテーブル)
+-------+------------+---------------+
| EmpID | meta_key | meta_value |
+-------+------------+---------------+
| A001 | FullName | 太郎 |
| A001 | Age | 31 |
| A002 | FullName | 花子 |
| A002 | Age | 35 |

以下略

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/08/19 11:16

DB が何か(SQL Server? Oracle? MySQL? その他?)を書きましょう。JOIN 句は使えませんか?
coinbura

2018/08/19 11:23

すみません。MySQLです。join句は、散々悪戦苦闘した末、select文2つを使って、かつ、元が同じテーブルだと使えないという結論に至ったのですが、間違いでしたでしょうか(^^A
guest

回答3

0

ベストアンサー

こんな漢字で、

SQL

1SELECT 2 a.EmpID 3 ,a.meta_value AS FullName 4 ,b.meta_value AS Age 5FROM 6 wp_usermeta AS a INNER JOIN wp_usermeta AS b ON 7 a.EmpID = b.EmpID 8WHERE 9 a.meta_key = 'FullName' 10 AND b.meta_key = 'Age' 11ORDER BY 12 a.EmpID

投稿2018/08/19 11:48

編集2018/08/19 13:22
hichon

総合スコア5737

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coinbura

2018/08/19 12:09

どうもうまくいきません。 たぶん、aとbが定義されていないせいかなとは思うのですが・・・。 もうちょっと探ってみます。
hichon

2018/08/19 13:22

一寸書き方を変更しました。
coinbura

2018/08/19 17:39

できた!できました! だいぶ時間かかっちゃいましたが、無事できました! ありがとうございます!
guest

0

SELECT文A,Bは自力でできたのですよね。
それをWITH句でサブクエリを定義すると簡単です。

sql

1WITH QUERY_A AS ( 2 SELECT文A 3),QUERY_B AS ( 4 SELECT文B 5) 6SELECT 7 A.EmpID 8 ,A,FullName 9 ,B,Age 10FROM 11 QUERY_A A 12 INNER JOIN QUERY_B B 13 ON A.EmpID = B.EmpID 14;

WITH句で定義したサブクエリが、後続のSELECT文でさも別のテーブルがあるかのようにアクセスすることができます。WITHを覚えると非常に強力ですよ。
深く学習するのなら、「SQL 共通テーブル式」で検索していろいろな記事を読んでみてください。

投稿2018/08/19 13:58

hope_mucci

総合スコア4447

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2018/08/19 15:29

MySQLという事なので、8.0以降でないと使えないですよ
coinbura

2018/08/19 17:43

saziさんの言われるように、動きませんでした(^^A
hope_mucci

2018/08/19 21:43

読み落としていました。申し訳ないです。タグをつけてもらうと有難いですね。
guest

0

全外部結合(Full join )じゃないかな?
MySQLはFull join 使えませんでしたすみません。
なので、Full join が使えない場合は以下のようになります。

SQL

1select a.EmpID, b.meta_value as FullName, c.meta_value as Age 2from (select EmpID from wp_usermeta group by EmpID) a 3 left join wp_usermeta b on a.EmpID=b.EmpID and b.meta_key='FullName' 4 left join wp_usermeta c on a.EmpID=c.EmpID and c.meta_key = 'Age'

サブクエリーだと

SQL

1select a.EmpID 2 , (select meta_value from wp_usermeta where EmpID=a.EmpID and meta_key='FullName')as FullName 3 , (select meta_value from wp_usermeta where EmpID=a.EmpID and meta_key='Age')as Age 4from (select EmpID from wp_usermeta group by EmpID) a

だけど、そんな構成になっているなら、設計者に聞くともっと効率の良い取り出し方が用意されているような気がします。
軸(EmpID)はトランザクションに求めているテーブルに見えますけど。

推測だけど、EmpIDを持ったトランザクションをtrnテーブルとしたとすると、

SQL

1select trn.EmpID, m_name.meta_value as FullName, m_age.meta_value as Age 2from trn 3 left join wp_usermeta as m_name 4 on trn.EmpID=m_name.EmpID and m_name.meta_key='FullName' 5 left join wp_usermeta as m_age 6 on trn.EmpID=m_age.EmpID and m_age.meta_key='Age'

じゃないかな。

投稿2018/08/19 12:01

編集2018/08/19 23:35
sazi

総合スコア25186

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coinbura

2018/08/19 17:43

ありがとうございます。 2つとも試してみたのですが、うまく動きませんでした。 (b`EmpID`→b.EmpID 等、いろいろ変更を加えてみたのですがダメでした) せっかく掲示いただいたのに、私の知識不足でうまく生かせず申し訳ございませんm(__)m
sazi

2018/08/19 23:38 編集

すみません。full join 使えませんでした(汗) でも、2つともという事はないですね。 書き換えたんですけど、上も下も結局のところ軸になるEmpIDさえあればってことなので。
sazi

2018/08/19 23:19

名前や年齢のデータが必ずしも無い場合はこの書き方になります。 必ずセットでデータがあるなら、hichonさんのinner joinの方が効率はいいですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問