サブクエリ

(親)SQL の中に( )で囲んで子 SQL 文を書くと、実行時にその部分の結果に置き換わった状態で親 SQL が実行されます。

例えば以下のサブクエリは、barテーブルからvaluenju33なレコード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