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

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

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

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

SQL

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

Q&A

解決済

2回答

478閲覧

結合したテーブルから複数条件に該当する列を取得するSQL

sashimi1221

総合スコア3

SQL Server

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

SQL

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

0グッド

0クリップ

投稿2022/07/31 04:58

前提

SQLServer2019にてSQL文を用いたプログラムを作成しております。
今回の質問に関連するテーブルとして以下の3つのテーブルがあります。

●生物テーブル
生物コード| 生物名
0001|ヒト
0002|カメ
0003|フラミンゴ
(以下生物名が続く)

●部位テーブル
部位コード| 部位名
1001|足
1002|手の指
1003|目
(以下部位名が続く)

●部位数テーブル
生物コード| 部位コード|部位数
0001|1001|2
0001|1002|10
0001|1003|2
0002|1001|4
0002|1002|0
0002|1003|2
0003|1001|1
0003|1002|0
0003|1003|2
(以下部位数が続く)

実現したいこと

部位と部位数を複数条件に設定したSQL文(条件文)を作成し、生物名(生物コード)を得たい。

上記の例から申しますと
「足の数が2本以上で目が2つ以上ある生物は?」というSQL文を作成して
「ヒトとカメ」という答えを得たいです。

試したこと

生物テーブルと部位数テーブルを結合するところまでは理解しております。

select 生物名 from 生物テーブル inner join 部位数テーブル on 生物テーブル.生物コード = 部位数テーブル.生物コード

この後どのように条件指定のSQL文を書けば良いのでしょうか?

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

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

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

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

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

guest

回答2

0

ベストアンサー

「足の数が2本以上で目が2つ以上ある生物は?」という条件は「「足の数が2本以上」かつ「目が2つ以上」ある生物は?」という2つの事象を満たす時ですから、質問のテーブル構成だと問い合わせは2回必要です。

素直に記述するなら以下です。

SQL

1select * from 生物 2where 生物コード in ( 3 select 生物コード 4 from 部位数 5 where 部位コード in ( 6 select 部位コード from 部位 where 部位名='足' 7 ) 8 and 部位数>=2 9 ) 10 and 生物コード in ( 11 select 生物コード 12 from 部位数 13 where 部位コード in ( 14 select 部位コード from 部位 where 部位名='目' 15 ) 16 and 部位数>=2 17 )

ですが、UI操作の場合には部位選択時にコードを判明させる事が出来るので、部位テーブルを参照する必要が無く以下の様な問い合わせになるでしょう。

SQL

1select * from 生物 2where 生物コード in ( 3 select 生物コード 4 from 部位数 5 where 部位コード = '1001' 6 and 部位数>=2 7 ) 8 and 生物コード in ( 9 select 生物コード 10 from 部位数 11 where 部位コード = '1003' 12 and 部位数>=2 13 )

投稿2022/07/31 07:28

編集2022/07/31 11:00
sazi

総合スコア25173

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

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

sashimi1221

2022/07/31 09:18

ご回答ありがとうございます! JOINしなくてもwhere文を駆使するだけで出来るんですね。 この方法で実装しようと思います。
guest

0

以下のようなクエリで実現できると思います。

SQL

1SELECT A.生物コード, A.生物名 2FROM 生物テーブル A 3JOIN 部位数テーブル B ON A.生物コード = B.生物コード 4JOIN 部位テーブル C ON B.部位コード = C.部位コード 5GROUP BY A.生物コード, A.生物名 6HAVING MAX(CASE WHEN C.部位名 = N'足' THEN B.部位数 END) >= 2 7AND MAX(CASE WHEN C.部位名 = N'目' THEN B.部位数 END) >= 2

投稿2022/07/31 06:51

neko_the_shadow

総合スコア2230

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

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

sashimi1221

2022/07/31 09:15

ご回答ありがとうございます! この方法で実現できました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問