🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

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

Q&A

解決済

2回答

7217閲覧

SQL SELECT時、他テーブルを参照してフラグを立てる

Rena112

総合スコア2

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

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

0グッド

0クリップ

投稿2020/11/24 13:11

編集2020/11/24 16:49

SQL初心者ですが、お知恵を拝借させていただきたいです。

以下内容でemployee テーブルから項目をselectしたいのですが、まず結合が必要かどうかすらわからず苦戦しています。。。
添付画像も参照していただき、教えていただけないでしょうか。初歩的な質問で申し訳ありません。。汗

■したいこと
employee テーブルをselectする際、employee_idが同一のcustomer テーブルのcust_nameが
customer_2 テーブルに一つでも存在し、かつそのレコードのemployee_idが同一でない場合、
select項目の「flg」を1にし、どれも存在しない場合、または存在していてもemployee_idが同一の場合は「flg」を0にする。

イメージ説明

以上、ご回答をお待ちしております。

■ 追記
説明にはcustomer テーブルとcustomer_2 テーブルのcust_nameが完全一致のものというような書き方をしましたが、
実際は部分一致したものにフラグを立てたいです。

sazi 様から頂いた回答の

on cst1.cust_name = cst2.cust_name
の部分を
on cst1.cust_name like CONCAT('%', cst2.cust_name, '%')

に変更して実行しましたが、やはり思うような結果が得られません。。
何か良い方法はありませんでしょうか。。?

■ サンプルデータ

customer.cst_name
hello株

customer_2.cst_name
hello株式会社

↑のようなデータ同士でも、部分一致で存在する判定にしたいです。

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

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

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

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

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

Rena112

2020/11/24 16:37

キャプチャは添付しないほうがよろしいのでしょうか? 分からないことばかりで申し訳ありません。
guest

回答2

0

sql

1SELECT E.employee_id, MAX(E.emp_name) AS emp_name 2 , MAX(CASE WHEN C2.customer_id IS NULL THEN 0 ELSE 1) AS flg 3FROM employee E 4 LEFT JOIN customer C 5 ON C.employee_id=E.employee_id 6 LEFT JOIN customer_2 C2 7 ON C2.cust_name=C.cust_name 8 AND C2.employee!=C.employee_id 9GROUP BY E.employee_id

って感じでしょうか。

投稿2020/11/24 14:04

gpsoft

総合スコア1323

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

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

Rena112

2020/11/24 15:05

ご回答ありがとうございます。ご参考にさせていただきます。
guest

0

ベストアンサー

・customer テーブルのcust_nameがcustomer_2 テーブルに一つでも存在し、かつそのレコードのemployee_idが同一でない場合
・どれも存在しない場合、または存在していてもemployee_idが同一の場合

上記は背反の関係ですから、一方の条件に当てはまるかどうかを判断すれば良い事になります。

求めるSELECTはemployeeの行数のままですから、flgの判定は相関サブクエリーとします。

SQL

1select employee.* 2 , case when 3 exists( 4 select 1 5 from customer cst1 6 inner join customer_2 cst2 7 on cst1.cust_name = cst2.cust_name 8 and cst1.employee_id != cst2.employee_id 9 where cst1.employee_id= employee.employee_id 10 ) 11 then 1 else 0 end as flg 12frpm employee

投稿2020/11/24 13:54

sazi

総合スコア25327

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

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

Rena112

2020/11/24 15:06

ご回答ありがとうございます。内部結合をつかうのですね、、、なるほど、非常に勉強になりました。 ベストアンサーにさせていただきます。
Rena112

2020/11/24 16:13

すみません。説明にはcust_nameが完全一致のものというような書き方をしましたが、実際は部分一致したものにフラグを立てたいです。。 on cst1.cust_name = cst2.cust_name の部分を on cst1.cust_name like CONCAT('%', cst2.cust_name, '%') に変更して実行しましたが、やはり思うような結果が得られません。。 何か良い方法はありませんでしょうか。。?
sazi

2020/11/24 16:38

MySQLですか? どのようなデータ同士で比較しているか、サンプルデータを質問に追記して下さい。
Rena112

2020/11/24 16:40

MYSQLです。承知しました。
Rena112

2020/11/24 16:55

追記いたしました。ご確認お願い致します。
sazi

2020/11/25 00:15

比較が逆です。 on cst2.cust_name like CONCAT('%', cst1.cust_name, '%')
Rena112

2020/11/25 08:38

sazi さん ありがとうございます。期待した通りのデータを取得することができました。 しかし恥ずかしながら、EXISTS内サブクエリの表のイメージが未だできていません。 もし可能でしたら簡単に説明いただきたいのですが、よろしいでしょうか。
sazi

2020/11/25 09:39 編集

結合のイメージはgpsoftさんの回答と同じです。 それとの違いは、集計(group by)をしていない点です。 Existsは1件でも該当するデータがあれば良いので、集計を必要としませんから。 あとは相関により、where 条件が結合の代わりとなっている点ですね。
Rena112

2020/11/25 09:20

sazi さん ご回答ありがとうございます。非常に勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問