子育てエンジニアブログ

子育てに励むシステムエンジニア(SE)のブログ

【SQL】【SQL Server】紐付かないテーブル同士で片方がデータがなくても抽出する方法

紐付かないテーブル同士で片方がデータがなくても抽出する方法についてです。
どんなタイミングでそういうことをしたくなるのか、なかなかタイミングはないとは思うけどちょっと詰まったのでメモ。

例えば、work1というテーブルがあってこちらは0〜複数レコードが入る。
そしてwork2というテーブルには1レコードだけ確実にある状態。
で、work1の内容とwork2の内容を合わせて抽出したい。(この2つのテーブルに紐付けられる情報はない。)
また、work1が0件だったとしても、work2の1レコードの内容は表示したい。

何がやっかいかというと、テーブル間に紐付けがないというところと、
メインとなるテーブルが0〜複数件なのでこちらをFROM句に書くと何も抽出できない。

んー、紐付けられたら外部結合で簡単なんだけどね。。
今回はSQL Serverで実現。

結果、T-SQLでレコードの存在チェックで条件分岐させ、別々のSQLを実行させることにした。

早速SQLについて。

1.複数件データがある時。

CREATE TABLE #work1
(id int
 ,name varchar(10)
);

CREATE TABLE #work2
(name2 varchar(10)
);

INSERT INTO #work1
    ([id], [name])
VALUES
    (1, 'test1');
    
INSERT INTO #work1
    ([id], [name])
VALUES
    (2, 'test11');

INSERT INTO #work2
    ([name2])
VALUES
    ('test2');
    
IF (EXISTS(SELECT 1 FROM #work1))
BEGIN 
  select id,name,(select name2 from #work2) from #work1
END
ELSE
BEGIN
    select '',name2 from #work2
END

f:id:STSA:20201113230209p:plain

2.片方がデータが0件の時。

CREATE TABLE #work1
(id int
 ,name varchar(10)
);

CREATE TABLE #work2
(name2 varchar(10)
);

INSERT INTO #work2
    ([name2])
VALUES
    ('test2');
    
IF (EXISTS(SELECT 1 FROM #work1))
BEGIN 
  select id,name,(select name2 from #work2) from #work1
END
ELSE
BEGIN
    select '',name2 from #work2
END

f:id:STSA:20201113230353p:plain

やりたいことは実現できたけど、単一のSQLで実現する方法はないものか。