【SQLServer】マスタテーブルから取得した項目をメインのテーブルで使用する方法

今日はマスタテーブルに存在するレコードを取得し、取得した情報をメインのテーブルで使用する方法を書いていきます。

1.使用するテーブル

・メインテーブル(社員テーブル)
メインとして取り扱うテーブルは社員のIDと役職ID、社員の名前を取り扱う社員テーブル(T_EMPLOYEE)です。

テーブルの内容
f:id:rumr-Labo:20190523004402p:plain

テーブルの中には社員のレコードが4レコードがすでに登録されています。
EMPLOYEE_ID列には社員ID、POSITION_ID列には役職ID、NAME列には社員の名前がそれぞれ登録されています。

・サブテーブル(役職マスタテーブル)
次にサブとして使用するテーブルです。このテーブルは役職名を保持しておくマスタテーブルです。(M_POSITION)
役職IDテーブル内には役職情報が4レコードすでに登録されています。

テーブルの内容
f:id:rumr-Labo:20190523001625p:plain

今回は役職マスタテーブルからこの役職情報を取得し、メインの社員テーブルで使用できるようにします。

2.役職情報を含んだ社員情報を取得する

役職情報を含む社員の情報を取得したい場合は社員テーブルと役職テーブルを結合します。

(1)社員テーブルと役職マスタテーブルを結合する

社員テーブルと役職マスタテーブルを結合するためにはINNER JOINを使用してテーブルを結合します。
テーブルの結合条件は2つのテーブルで共通して持っている列を結合条件とする必要があります。

今回、2つのテーブルで役職IDを取り扱っており、この列を結合条件としてテーブルを結合します。

・実際のSQL

--SELECT文
--役職マスタテーブルと役職IDを条件にテーブル結合を行い、レコードを取得した場合
SELECT TE.EMPLOYEE_ID
,TE.POSITION_ID
,TE.NAME 
,MP.ID
,MP.POSITION
FROM T_EMPLOYEE AS TE
INNER JOIN M_POSITION AS MP
ON TE.POSITION_ID = MP.ID

実際のSQLでは上記のようにSQLを書きます。
メインテーブルの社員テーブルのPOSITION_ID列とサブテーブルの役職マスタテーブルのID列をON句で結合することでテーブルの結合が可能となります。

出力結果
f:id:rumr-Labo:20190523004550p:plain

出力結果は画像の通りになります。
役職IDに一致する役職名がそれぞれのレコードで取得することができました。
INNER JOIN句は2つ以上使用することも可能であるため、取り扱いたいマスタテーブルが増えても同じように記述していけば特に問題はありません。

(2)不要な列を削除する

前項で社員テーブルと役職マスタテーブルの結合が完了しました。
一応前項で社員情報の取得は完了していますが、この項では不要な列を削除していきます。

出力結果を見てわかる通り、結合条件で使用した役職ID列が不要な列であるため、役職ID列を削除します。
列の削除に加え、列の並び順も少し変更を加えます。

--SELECT文
--役職マスタテーブルと役職IDを条件にテーブル結合を行い、レコードを取得した場合
SELECT TE.EMPLOYEE_ID
,MP.POSITION
,TE.NAME 
FROM T_EMPLOYEE AS TE
INNER JOIN M_POSITION AS MP
ON TE.POSITION_ID = MP.ID

出力結果
f:id:rumr-Labo:20190523005815p:plain

役職ID列を取り除き、出力結果がすっきりしました。

3.まとめ

今回はマスタ情報を取り扱うマスタテーブルから情報を取り出し、その情報をメインテーブルで使用できるようにすることを行いました。
この方法を使用することでデータを確実に取得することができ、無駄な処理をプログラム側で書く必要性が減少します。
また、データベースのメンテナンスをするときにも最小限の修正で済ますことができるためおすすめです。

使用したテーブルを構成するSQL

社員テーブル(T_EMPLOYEE)

テーブル作成用SQL

--社員テーブル テーブル作成用SQL
CREATE TABLE T_EMPLOYEE
(
EMPLOYEE_ID NVARCHAR(5) NOT NULL,
POSITION_ID NVARCHAR(3) NOT NULL,
NAME NVARCHAR(50) NOT NULL,
PRIMARY KEY(EMPLOYEE_ID,POSITION_ID)
);

レコード追加用SQL

--INSERT文
INSERT INTO T_EMPLOYEE(EMPLOYEE_ID,POSITION_ID,NAME)VALUES('00001','004','テスト太郎');
INSERT INTO T_EMPLOYEE(EMPLOYEE_ID,POSITION_ID,NAME)VALUES('00002','003','テスト次郎');
INSERT INTO T_EMPLOYEE(EMPLOYEE_ID,POSITION_ID,NAME)VALUES('00003','002','テスト花子');
INSERT INTO T_EMPLOYEE(EMPLOYEE_ID,POSITION_ID,NAME)VALUES('00004','001','テスト三郎');

役職テーブル(M_POSITION)

テーブル作成用SQL

--役職マスタテーブル テーブル作成用SQL
CREATE TABLE M_POSITION
(ID NVARCHAR(3) PRIMARY KEY NOT NULL,
POSITION NVARCHAR(50) NOT NULL,
);

レコード追加用SQL

--INSERT文
INSERT INTO M_POSITION(ID,POSITION)VALUES('001','一般社員');
INSERT INTO M_POSITION(ID,POSITION)VALUES('002','主任');
INSERT INTO M_POSITION(ID,POSITION)VALUES('003','係長');
INSERT INTO M_POSITION(ID,POSITION)VALUES('004','課長');

実行環境

OS:Windows10
SQLServer Management Studio v17.4