こちらの記事 にある「相関サブクエリの複数カラムを一括で取得する」件、LATERAL句を使うことができないか?と思いました。
LATERAL 句
- Oracle 12c (12.1) から
- PostgreSQL 9.3 から
- MySQL 8.0.14 から
スキーマ
create table cmain
(
n varchar(1),
d varchar(2),
key1 varchar(3),
key2 varchar(4)
);
create table csubt
(
d varchar(4),
dd varchar(3),
key1 varchar(3),
key2 varchar(4)
);
insert into cmain values('1','11','111','1111');
insert into cmain values('2','22','222','2222');
insert into cmain values('3','33','333','3333');
insert into csubt values('1100','101','111','1111');
insert into csubt values('2200','202','222','2222');
insert into csubt values('3300','303','333','3333');
SQL
SELECT cm.n AS cm_n,
cm.d AS cm_d,
cm.key1 AS cm_key1,
cm.key2 AS cm_key2,
cb.d AS cb_d,
cb.dd AS cb_dd
FROM cmain cm,
LATERAL (
SELECT t.d, t.dd
FROM csubt t
WHERE t.key1 = cm.key1
AND t.key2 = cm.key2
) cb
ORDER BY cm_key1, cm_key2
実行結果
cm_n | cm_d | cm_key1 | cm_key2 | cb_d | cb_dd |
---|---|---|---|---|---|
1 | 11 | 111 | 1111 | 1100 | 101 |
2 | 22 | 222 | 2222 | 2200 | 202 |
3 | 33 | 333 | 3333 | 3300 | 303 |
個人的には
使いみちとして合ってそうですが、頻繁に LATERAL
を使うかと言われると、微妙。
列が2個くらいだったら、SELECT句に副問合せを書いてしまうかも。