(親)SQL の中に( )
で囲んで子 SQL 文を書くと、実行時にその部分の結果に置き換わった状態で親 SQL が実行されます。
例えば以下のサブクエリは、bar
テーブルからvalue
がnju33
なレコードfoo_id
を返します。
select * from foo
where foo_id = (
select foo_id from bar where value = 'nju33'
);
例えばそれが33
だった場合、以下のように展開されます。
select * from foo where foo_id = 33;
またwith
構文を使う方法もあります。
環境。
create schema tmp;
set search_path to tmp;
create table foo (
id serial,
foo varchar(255)
);
create table bar (
id serial,
bar varchar(255)
);
insert into foo (foo) values ('a'), ('b'), ('c');
insert into bar (bar) values ('1'), ('2'), ('3');
以下はselect * from bar where id > 1
の結果テーブルに対してinner join
するという意味になる。
with as_bar as (select * from bar where id > 1)
select foo.id, foo.foo, as_bar.bar
from foo
inner join as_bar
on foo.id = as_bar.id;
この結果は以下のようになります。
id | foo | bar
----+-----+-----
2 | b | 2
3 | c | 3
(2 rows