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

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

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

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

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

受付中

SQLで異なるテーブルそれぞれの条件を満たす行を取得したい

smaeda
smaeda

総合スコア0

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

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

1回答

-1評価

1クリップ

9閲覧

投稿2021/02/16 04:28

編集2022/01/12 10:55

環境

・SQLServer2008

やりたいこと

異なるテーブルそれぞれの条件を満たす行を一発のクエリで取得する事は可能でしょうか。
テーブル構造が結構複雑で文章だと説明が難しいため、詳細は下記を御覧ください。

商品マスタ関連

・商品には種別が存在しており、1商品に付き複数の種別を設定できる
・「商品種別紐付けマスタ」を元に「商品」と「種別」の紐付けを行っている

イメージ説明


オプション関連

・商品種別は別に「オプション」が存在している
・オプションは商品マスタに紐づくのではなく、注文トランに紐づく
・1注文に付き複数オプションが選択できる
イメージ説明

割引マスタ関連

・「商品種別」と「オプション」の組み合わせによって割引マスタが決定される
・商品種別のみで判断する場合もあれば、オプションのみで判断する場合もある
・条件に一致する割引マスタが取得されればOK(=複数行が取得される場合もあるということ)

イメージ説明


イメージ説明


望まれる結果

イメージ説明

イメージ説明

イメージ説明


CREATE文

SQL

USE [test] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[m_option]( [option_id] [int] NOT NULL, [option_name] [nchar](50) NULL, CONSTRAINT [PK_m_option] PRIMARY KEY CLUSTERED ( [option_id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[m_shohin]( [shohin_id] [int] NOT NULL, [shohin_name] [nchar](50) NULL, CONSTRAINT [PK_m_shohin] PRIMARY KEY CLUSTERED ( [shohin_id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[m_shohin_syubetu]( [shohin_id] [int] NOT NULL, [syubetu_id] [int] NOT NULL, CONSTRAINT [PK_m_shohin_syubetu] PRIMARY KEY CLUSTERED ( [shohin_id] ASC, [syubetu_id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[m_syubetu]( [syubetu_id] [int] NOT NULL, [syubetu_name] [nchar](50) NULL, CONSTRAINT [PK_m_syubetu] PRIMARY KEY CLUSTERED ( [syubetu_id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[m_waribiki]( [waribiki_id] [int] NOT NULL, [waribiki_name] [nchar](50) NULL, [waribiki_ritu] [int] NULL, CONSTRAINT [PK_m_waribiki] PRIMARY KEY CLUSTERED ( [waribiki_id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[m_waribiki_option]( [waribiki_id] [int] NOT NULL, [option_id] [int] NOT NULL, CONSTRAINT [PK_m_warbiki_option] PRIMARY KEY CLUSTERED ( [waribiki_id] ASC, [option_id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[m_waribiki_syubetu]( [waribiki_id] [int] NOT NULL, [syubetu_id] [int] NOT NULL, CONSTRAINT [PK_m_waribiki_syubetu] PRIMARY KEY CLUSTERED ( [waribiki_id] ASC, [syubetu_id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[t_uriage]( [denp_no] [int] NOT NULL, [det_no] [int] NOT NULL, [shohin_id] [int] NULL, [su] [int] NULL, CONSTRAINT [PK_t_uriage] PRIMARY KEY CLUSTERED ( [denp_no] ASC, [det_no] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[t_uriage_option]( [denp_no] [int] NOT NULL, [det_no] [int] NOT NULL, [option_id] [int] NOT NULL, CONSTRAINT [PK_t_uriage_option] PRIMARY KEY CLUSTERED ( [denp_no] ASC, [det_no] ASC, [option_id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO INSERT [dbo].[m_option] ([option_id], [option_name]) VALUES (1, N'3営業日以降出荷 ') GO INSERT [dbo].[m_option] ([option_id], [option_name]) VALUES (2, N'包装紙無し ') GO INSERT [dbo].[m_shohin] ([shohin_id], [shohin_name]) VALUES (1, N'明治チョコレート ') GO INSERT [dbo].[m_shohin] ([shohin_id], [shohin_name]) VALUES (2, N'グリコチョコレート ') GO INSERT [dbo].[m_shohin] ([shohin_id], [shohin_name]) VALUES (3, N'グリコクッキー ') GO INSERT [dbo].[m_shohin] ([shohin_id], [shohin_name]) VALUES (4, N'明治チョコ&クッキーセット ') GO INSERT [dbo].[m_shohin_syubetu] ([shohin_id], [syubetu_id]) VALUES (1, 1) GO INSERT [dbo].[m_shohin_syubetu] ([shohin_id], [syubetu_id]) VALUES (1, 3) GO INSERT [dbo].[m_shohin_syubetu] ([shohin_id], [syubetu_id]) VALUES (2, 2) GO INSERT [dbo].[m_shohin_syubetu] ([shohin_id], [syubetu_id]) VALUES (2, 3) GO INSERT [dbo].[m_shohin_syubetu] ([shohin_id], [syubetu_id]) VALUES (3, 2) GO INSERT [dbo].[m_shohin_syubetu] ([shohin_id], [syubetu_id]) VALUES (3, 4) GO INSERT [dbo].[m_shohin_syubetu] ([shohin_id], [syubetu_id]) VALUES (4, 1) GO INSERT [dbo].[m_shohin_syubetu] ([shohin_id], [syubetu_id]) VALUES (4, 3) GO INSERT [dbo].[m_shohin_syubetu] ([shohin_id], [syubetu_id]) VALUES (4, 4) GO INSERT [dbo].[m_syubetu] ([syubetu_id], [syubetu_name]) VALUES (1, N'明治 ') GO INSERT [dbo].[m_syubetu] ([syubetu_id], [syubetu_name]) VALUES (2, N'グリコ ') GO INSERT [dbo].[m_syubetu] ([syubetu_id], [syubetu_name]) VALUES (3, N'チョコレート ') GO INSERT [dbo].[m_syubetu] ([syubetu_id], [syubetu_name]) VALUES (4, N'クッキー ') GO INSERT [dbo].[m_waribiki] ([waribiki_id], [waribiki_name], [waribiki_ritu]) VALUES (1, N'チョコレート割 ', 10) GO INSERT [dbo].[m_waribiki] ([waribiki_id], [waribiki_name], [waribiki_ritu]) VALUES (2, N'包装紙無し割引 ', 5) GO INSERT [dbo].[m_waribiki] ([waribiki_id], [waribiki_name], [waribiki_ritu]) VALUES (3, N'3営業日以降出荷 割引(明治チョコ限定) ', 3) GO INSERT [dbo].[m_waribiki] ([waribiki_id], [waribiki_name], [waribiki_ritu]) VALUES (4, N'3営業日以降出荷 割引+包装紙無し割引(チョコレート限定) ', 5) GO INSERT [dbo].[m_waribiki] ([waribiki_id], [waribiki_name], [waribiki_ritu]) VALUES (5, N'3営業日以降出荷 割引+包装紙無し割引(グリコクッキー限定) ', 5) GO INSERT [dbo].[m_waribiki_option] ([waribiki_id], [option_id]) VALUES (2, 2) GO INSERT [dbo].[m_waribiki_option] ([waribiki_id], [option_id]) VALUES (3, 1) GO INSERT [dbo].[m_waribiki_option] ([waribiki_id], [option_id]) VALUES (4, 1) GO INSERT [dbo].[m_waribiki_option] ([waribiki_id], [option_id]) VALUES (4, 2) GO INSERT [dbo].[m_waribiki_option] ([waribiki_id], [option_id]) VALUES (5, 1) GO INSERT [dbo].[m_waribiki_option] ([waribiki_id], [option_id]) VALUES (5, 2) GO INSERT [dbo].[m_waribiki_syubetu] ([waribiki_id], [syubetu_id]) VALUES (1, 3) GO INSERT [dbo].[m_waribiki_syubetu] ([waribiki_id], [syubetu_id]) VALUES (3, 1) GO INSERT [dbo].[m_waribiki_syubetu] ([waribiki_id], [syubetu_id]) VALUES (3, 3) GO INSERT [dbo].[m_waribiki_syubetu] ([waribiki_id], [syubetu_id]) VALUES (4, 3) GO INSERT [dbo].[m_waribiki_syubetu] ([waribiki_id], [syubetu_id]) VALUES (5, 2) GO INSERT [dbo].[m_waribiki_syubetu] ([waribiki_id], [syubetu_id]) VALUES (5, 3) GO INSERT [dbo].[t_uriage] ([denp_no], [det_no], [shohin_id], [su]) VALUES (1, 1, 1, 5) GO INSERT [dbo].[t_uriage] ([denp_no], [det_no], [shohin_id], [su]) VALUES (2, 1, 3, 5) GO INSERT [dbo].[t_uriage] ([denp_no], [det_no], [shohin_id], [su]) VALUES (3, 1, 1, 5) GO INSERT [dbo].[t_uriage] ([denp_no], [det_no], [shohin_id], [su]) VALUES (4, 1, 3, 5) GO INSERT [dbo].[t_uriage] ([denp_no], [det_no], [shohin_id], [su]) VALUES (5, 1, 3, 5) GO INSERT [dbo].[t_uriage] ([denp_no], [det_no], [shohin_id], [su]) VALUES (5, 2, 1, 10) GO INSERT [dbo].[t_uriage_option] ([denp_no], [det_no], [option_id]) VALUES (2, 1, 2) GO INSERT [dbo].[t_uriage_option] ([denp_no], [det_no], [option_id]) VALUES (3, 1, 2) GO INSERT [dbo].[t_uriage_option] ([denp_no], [det_no], [option_id]) VALUES (4, 1, 1) GO INSERT [dbo].[t_uriage_option] ([denp_no], [det_no], [option_id]) VALUES (4, 1, 2) GO INSERT [dbo].[t_uriage_option] ([denp_no], [det_no], [option_id]) VALUES (5, 1, 1) GO INSERT [dbo].[t_uriage_option] ([denp_no], [det_no], [option_id]) VALUES (5, 1, 2) GO INSERT [dbo].[t_uriage_option] ([denp_no], [det_no], [option_id]) VALUES (5, 2, 1) GO INSERT [dbo].[t_uriage_option] ([denp_no], [det_no], [option_id]) VALUES (5, 2, 2) GO

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

Orlofsky
Orlofsky

2021/02/16 07:40 編集

現行の途中までできているであろうSELECT文も載せましょう。ここの掲示板は丸投げは非推奨です。
Orlofsky
Orlofsky

2021/02/16 07:43

ローマ字表はヘボン式を使われては?ヘボン式を使わないで損をする人が多いです。 https://www\.ezairyu\.mofa\.go\.jp/passport/hebon\.html
smaeda
smaeda

2021/02/16 08:09

下記SQLのように、売上伝票 配送オプション管理テーブルから、 まずは配送オプション割引条件マスタを絞り込み、 更にそこから商品種別割引条件マスタを絞り込もうと思ったのですが、 下記方法だと、オプションが選択されていない注文の場合に取得出来ないことに気がつき、 行き詰まってしまいました・・・ (文字数制限に引っかかり質問の欄に追記ができないため、こちらにSQLを記載いたします) またヘボン式の件に関しましても、ご教示いただきありがとうございます。 select \* from \( select t_uriage_option\.option_id, m_waribiki_syubetu\.waribiki_id, count\(\*\) need_hantei, sum\(case when m_shohin_syubetu\.syubetu_id is not null then 1 else 0 end\) jissai_hantei from t_uriage left join t_uriage_option on t_uriage\.denp_no = t_uriage_option\.denp_no and t_uriage\.det_no = t_uriage_option\.det_no left join m_waribiki_option on t_uriage_option\.option_id = m_waribiki_option\.option_id left join m_waribiki_syubetu on m_waribiki_option\.waribiki_id = m_waribiki_syubetu\.waribiki_id left join m_shohin_syubetu on t_uriage\.shohin_id = m_shohin_syubetu\.shohin_id and m_waribiki_syubetu\.syubetu_id = m_shohin_syubetu\.syubetu_id where t_uriage\.denp_no = 1 group by t_uriage_option\.option_id, m_waribiki_syubetu\.waribiki_id \) tmp where need_hantei = jissai_hantei
Orlofsky
Orlofsky

2021/02/16 08:17

ここではなく質問を修正してください。ここはMarkdownを使えません。 syubetu ↓ shubetsu
smaeda
smaeda

2021/02/16 08:42

申し訳ありません。テーブル名やカラム名はヘボン式に修正しました。 実際に試してみたSQLに関しては、文字数の制限で質問欄にこれ以上追記が出来ないため こちらに記載させてください。 select \* from \( select t_uriage_option\.option_id, m_waribiki_shubetsu\.waribiki_id, count\(\*\) need_hantei, sum\(case when m_shohin_shubetsu\.shubetsu_id is not null then 1 else 0 end\) jissai_hantei from t_uriage left join t_uriage_option on t_uriage\.denp_no = t_uriage_option\.denp_no and t_uriage\.det_no = t_uriage_option\.det_no left join m_waribiki_option on t_uriage_option\.option_id = m_waribiki_option\.option_id left join m_waribiki_shubetsu on m_waribiki_option\.waribiki_id = m_waribiki_shubetsu\.waribiki_id left join m_shohin_shubetsu on t_uriage\.shohin_id = m_shohin_shubetsu\.shohin_id and m_waribiki_shubetsu\.shubetsu_id = m_shohin_shubetsu\.shubetsu_id where t_uriage\.denp_no = 1 group by t_uriage_option\.option_id, m_waribiki_shubetsu\.waribiki_id \) tmp where need_hantei = jissai_hantei
Orlofsky
Orlofsky

2021/02/16 11:28

SELECT文も質問に追加してください。
smaeda
smaeda

2021/02/16 11:39

申し訳ありませんが、文字数の制限に引っかかり 質問欄にこれ以上の追記が出来ない状況です・・・
Orlofsky
Orlofsky

2021/02/16 15:52

ちらっと見ただけですが、 テーブル定義で m_shohin_shubetsu の shubetsu_id not null NOT NULL制約があるからNULLのデータはINSERTできないのに SELECT文で sum\(case when m_shohin_shubetsu\.shubetsu_id is not null then 1 else 0 end\) jissai_hantei や need_hantei = jissai_hantei は意味があるのですか?
smaeda
smaeda

2021/02/17 03:53

①t_uriage_optionとm_waribiki_optionをJOINする事で条件に一致する「m_waribiki\.waribiki_id」を特定 ②「①」で特定したwairibiki_idを元にm_waribiki_shubetsuをJOIN ③更にm_shohin_shubetsuをJOINする 「③」の時点で、割引対象となる商品種別と商品マスタで設定されている種別が一致しない行は「m_shohin_shubetsu\.shubetsu_id」がNULLとなるので NULL判定を行う事によって双方の種別が合致しているかの判断が出来るかなと考えました。 ですが、そもそもオプションが選択されている事が大前提なクエリだと言うことに気が付き 行き詰まってしまった状況となります・・・
Orlofsky
Orlofsky

2021/02/17 05:21

SQLって最初から目標レベルで記述するのではなく、正常に動作することを確認しながらJOINを1つずつ追加して行くものです。その途中でテーブル設計がこれではまずい、とか気がつける場合もあります。 また、通常 SEECT T1\.SHUBETSU FROM TABLE1 T1 ; のようにテーブルの別名を使うことでSQLをちょっとシンプルにできます。
Orlofsky
Orlofsky

2021/02/17 06:17 編集

ここまではうまくいったというSELECT文とその結果、その次はエラーになったとか希望とは違うというSELECT文とその結果をこの下に追加しては?
sazi
sazi

2021/02/17 12:43 編集

@smaedaさん ここへの追記は、質問の続きとして回答の方に書かれた方が良いですね。
sazi
sazi

2021/02/17 12:46

パターン⑤だけ複数の明細が条件になっているんですけど、パターン⑤以外は明細が1行のみという条件が暗黙ですか?

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

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