Я так понял, речь идёт о PostgreSQL, поэтому варианты решения буду основывать на этой системе.
Вариант 1. Использовать правило (rule) для определённых действий. Например, чтобы добавлять в таблицу b только нужные записи, можно использовать такое правило:
create rule check_b_insert as on insert to b
where new.task not in (select id from a where ask=1)
do instead nothing;
Неудобство этого способа в том, что, во-первых, надо написать правила для вставки и обновления таблицы b, а также для обновления и удаления таблицы a (ведь надо поддерживать целостность и после добавления записей в b); во-вторых, если правило срабатывает, никаких ошибок не возникает, записи просто игнорируются.
Вариант 2. В ограничении на поле можно использовать собственную функцию:
create function check_task(task int) returns boolean
as 'select task in (select id from a where ask=1)'
language SQL;
create table b
(
id serial primary key,
task int references a(id) check(check_task(task))
);
Вариант 3. Немного модифицировав таблицы, можно наложить ограничение встроенными средствами. Идея в использовании в таблице b внешнего ключа по двум полям, соответствующим полям id и ask в таблице a, для чего в таблицу b добавляется генерируемый столбец ask, всегда равный 1.
create table a
(
id serial primary key,
ask int,
unique (id, ask)
);
create table b
(
id serial primary key,
task int,
ask int generated always as (1) stored,
foreign key (task, ask) references a(id, ask)
);
Если же вдруг генерируемый столбец использовать не хочется, можно добавить обычный столбец, но ограничить его значение:
ask int check(ask=1) default 1