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

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

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

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

JOIN

これはSQL文のJOINに関するタグです。リレーショナルデータベースシステムの二つ以上のテーブルを結合する際に、この構文が利用されます。

SQL

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

2回答

376閲覧

データの結合が上手くできなくて困っています。

wasi300

総合スコア66

MySQL

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

JOIN

これはSQL文のJOINに関するタグです。リレーショナルデータベースシステムの二つ以上のテーブルを結合する際に、この構文が利用されます。

SQL

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2020/09/25 08:28

編集2020/09/25 15:42

お世話になります。SQLが分からなくて困っています。

顧客データと紐づいている見積情報、請求書情報、を取得したいのですが、
下記のようにSQLを書くと見積情報が無い場合、請求情報を引くことができません。

追記==========
顧客データは更に上位概念の会社IDと紐づいています。

SQL

1select estimate.estimate_id,estimate.invoice_id 2from estimate 3left join invoice on estimate.estimate_id = invoice.estimate_id 4left join customer on customer.customer_id = estimate.customer_id 5where 6#customer.customer_id = 123456 7customer.company_id = 123456

顧客テーブルをもう1個JOINして下記のようにSQLを組んだり

SQL

1select estimate.estimate_id,invoice.invoice_id 2from estimate 3left join invoice on estimate.estimate_id = invoice.estimate_id 4left join customer on customer.customer_id = estimate.customer_id 5left join customer t1 on t1.customer_id = invoice.customer_id 6where 7#customer.customer_id = 123456 8customer.company_id = 123456

顧客テーブルのJOINのONの条件を

SQL

1select estimate.estimate_id,invoice.invoice_id 2from estimate 3left join invoice on estimate.estimate_id = invoice.estimate_id 4left join customer on 5(customer.customer_id = estimate.customer_id) 6or 7(customer.customer_id = invoice.customer_id) 8where 9#customer.customer_id = 123456 10customer.company_id = 123456

とやってみたのですが、請求情報のみある場合の取得ができませんでした。
顧客データに紐づく、見積情報と請求情報、どちらかがあれば取得できるようにするには
どうしたら良いのか教えていただけないでしょうか。

ここから追記==========

saziさんの

見積と請求を全外部結合(Full JOIN)した結果との結合にすれば良いかと思います。

上記コメントと頂いたSQLを元に、SQLを再構築しました。
私の使ってるMySQLだとFULL JOINできないのでUNION使わないとダメだそうです。

SQL

1select q1.estimate_id,q1.invoice_id 2from 3( 4select estimate.estimate_id,estimate.invoice_id 5from customer 6left join estimate 7 on (estimate.customer_id = customer.customer_id) 8where 9 customer.company_id = ? 10and 11 estimate.estimate_id is not null 12union 13select invoice.estimate_id,invoice.invoice_id 14from customer 15left join invoice 16 on (invoice.customer_id = customer.customer_id) 17where 18 customer.company_id = ? 19and 20 invoice.estimate_id is not null 21) as q1 22group by q1.estimate_id; 23

上記SQLでこのスレッドの問題については上手く行ったのですが、
そもそも問題を間違えていることに今気が付きました。

皆さん、本当にありがとうございました。

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

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

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

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

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

m.ts10806

2020/09/25 08:32

テーブル定義(CREATE TABLE文)とサンプルデータ(INSERT文)を提示したうえで「どういうデータを取得したいか」を具体的に記載された方が良いかと思います。 あと、提示されたコードだとどういう結果になるのか。
wasi300

2020/09/25 08:40

CREATE TABLE文とINSERT文をすぐに用意する方法が分からないので、用意せずに質問してしまいました。アドバイスありがとうございます。
sazi

2020/09/25 08:44

データベースの種類は何ですか? タグに追加して明確にして下さい。
m.ts10806

2020/09/25 09:37

テーブル、データを作ったのなら幾らでもやりようはあります。
wasi300

2020/09/25 13:49 編集

>> saziさん ありがとうございます。MySQLです。追加します。 >> m.ts10806さん そうなんですね
guest

回答2

0

ベストアンサー

顧客データに紐づく、見積情報と請求情報、どちらかがあれば取得

見積と請求を全外部結合(Full JOIN)した結果との結合にすれば良いかと思います。

SQL

1select * 2from customer 3 inner join ( 4 estimate full join invoice 5 on estimate.customer_id = invoice.customer_id 6 and estimate.estimate_id = invoice.estimate_id 7 ) 8 on customer.customer_id = coalesce(estimate.customer_id , invoice.customer_id) 9where customer.customer_id = 1

投稿2020/09/25 09:10

sazi

総合スコア25327

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

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

wasi300

2020/09/25 15:42

スレッドの内容に追記しました。ありがとうございました。
guest

0

テーブル構成と中身がわからんので何とも言えないですが、”顧客データと紐づいている見積情報、請求書情報”ってことでfrom customerをベースに残りの二つのテーブルをleft joinで紐づければいいのではないでしょうか。
(customerが多分顧客ですよね?)

投稿2020/09/25 08:33

tomomo

総合スコア430

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

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

wasi300

2020/09/25 08:41 編集

限定された情報の中、教えていただきありがとうございます。 助かりました。これで行けそうです。 customerは顧客です。情報少なくてすみません。
sazi

2020/09/25 09:16 編集

それだけだと、同じ顧客での見積もりと請求を結び付ける情報が不足すると思いますけど。 (要は重複が発生する)
wasi300

2020/09/25 15:43

>> saziさん customerを軸にするという発想がなかったので、とても参考になりました。重複については、後でどーにかなるだろうと思ってました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問