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

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

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

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

Q&A

解決済

2回答

1683閲覧

結合条件にNULL値を含むVIEWの作成

shutooooh

総合スコア13

SQL

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

0グッド

0クリップ

投稿2021/07/14 05:26

編集2021/07/14 07:46

前提

テーブル[tbl_staff_skill]にスタッフの保持しているスキルを格納しています。
※スタッフが保持していないSkillは[tbl_staff_skill]にデータは無し

######[tbl_skill]
スキル一覧

★skillIDskillTypeskillItem
A01言語ASP.NET
A02言語C#
A03言語SQL
######[tbl_staff_skill]
  • スタッフの保持しているスキル一覧
  • DBでのpractice_flagとtraining_flagのデフォルト値は0で設定
staffID★skillIDpractice_flagtraining_flag
00001A0101
00001A0211
00002A0111
00002A0301

実現したいこと

テーブル[tbl_skill]のデータをすべて表示させ、
テーブル[tbl_staff_skill]の[staffID]='00001'のデータと結合したい。
(⇒staffID=00001の持っているスキルと持っていないスキルを表示させたい)

【イメージ】
######[vw_staff_skill]

★skillIDskillTypeskillItempractice_flagtraining_flag
A01言語ASP.NET01
A02言語C#11
A03言語SQL00

※skillID=03のデータはテーブル[tbl_staff_skill]にはないが、表示する

上記のようなVIEWの作成は可能でしょうか。
もし可能でしたら、ご教授いただきたく。

よろしくお願いいたします。

試したこと

​・LEFT JOINを使用

html

1SELECT dbo.tbl_skill.*, dbo.tbl_staff_skill.staffID, dbo.tbl_staff_skill.practice_flag, dbo.tbl_staff_skill.training_flag 2FROM dbo.tbl_skill 3LEFT OUTER JOIN dbo.tbl_staff_skill ON dbo.tbl_skill.skillID = dbo.tbl_staff_skill.skillID 4WHERE (dbo.tbl_staff_skill.staffID = 00001) OR (dbo.tbl_staff_skill.staffID IS NULL)

⇒既に他のstaffIDで登録されているtbl_skillのデータは表示されなくなってしまう

・UNIONを使用してみる

テーブル[tbl_staff_skill]にデータが登録されていないがpractice_flagやtraining_flagに1が入ったデータも入ってきてしまう

以上から、
テーブル[tbl_staff_skill]に
一つの[staffID]に対してテーブル[tbl_skill]のすべての[skillID]を結び付けたSQL文を
あらかじめ発行しておく方法しか浮かばなかった為、
別のSQLで対処できる方法がないかとこちらにて質問させていただきました。

(例)
INSERT INTO dbo.tbl_staff_skill VALUES (00001, 'A01', 0, 0);
INSERT INTO dbo.tbl_staff_skill VALUES (00001, 'A02', 0, 0);
INSERT INTO dbo.tbl_staff_skill VALUES (00001, 'A03', 0, 0);
....続

補足情報(FW/ツールのバージョンなど)

使用しているDB:SQL Server 2019

ASP.NET Webフォームでスタッフのスキル登録ができるウェブアプリを作成しています

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

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

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

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

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

maisumakun

2021/07/14 05:46

データベースエンジンの種類とバージョンは何でしょうか?
m.ts10806

2021/07/14 06:09

大抵のことは「可能」です。 自身が何かしら調べたり試したりしてそれでも実現できていないのでしたら、現状として記載してください
shutooooh

2021/07/14 06:11

記載不足ですみません。 SQL Server2019を使用しております。
m.ts10806

2021/07/14 06:20

質問は編集できます
shutooooh

2021/07/14 07:29

ご指摘いただき有難うございます。修正いたしました。
guest

回答2

0

一応答えを回答されている方がいらっしゃるので、参考まで

SQL結合について

今回のパターンだと外部結合になります。
回答してくださっている方も外部結合(left join)で取得してます。

投稿2021/07/14 08:51

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

shutooooh

2021/07/14 10:59

返信が遅くなり申し訳ありません。 外部結合について調べていたものの、思うようなSQLがかけず悩んでおりましたが勉強になりました。 回答いただき有難うございました。
退会済みユーザー

退会済みユーザー

2021/07/14 11:02

解決したようで良かったです! 頑張ってください!
shutooooh

2021/07/14 11:05

有難うございます。。!! 未熟者の質問ですみません。頑張ります>< また機会がありましたらよろしくお願いします。
guest

0

ベストアンサー

left join してnullとなったものを0に置き換えてあげれば良いですね。
Nullを特定の値に置き換えるのには、CASEよりNullの扱いに特化したCOALESCE()を用いた方が簡潔です。

SQL

1select tbl_skill.* 2 , coalesce(tbl_staff_skill.practice_flag, 0) as practice_flag 3 , coalesce(tbl_staff_skill.training_flag, 0) as training_flag 4from tbl_skill 5 left join tbl_staff_skill 6 on tbl_skill.skillid = tbl_staff_skill.skillid 7 and tbl_staff_skill.staffid = '00001'

投稿2021/07/14 08:06

編集2021/07/14 08:10
sazi

総合スコア25327

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

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

shutooooh

2021/07/14 10:38

回答いただき誠に有難うございます。 いただいた回答通りに試してみたところ、うまく動いてくれて感動しています。 大変助かりました。本当に有難うございました。
sazi

2021/07/14 10:42

外部結合の際に、片側だけの結合条件とするのがポイントです。
shutooooh

2021/07/14 11:02 編集

LEFT JOINの中にWHERE句ではなくANDで条件を加える、という考えも全く浮かばず いただいた回答をみた際にもこれでできるんだ・・!?というレベルでした。 SQL本は何度も見返したつもりなのですが私自身では導き出せませんでした。 助けていただき本当に有難うございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問