Я так понял, речь идёт о 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