Похоже, что вам здесь нужно использовать левое внешнее соединение.Опять же, не идеальное решение и, возможно, изменение структуры базы данных было бы лучше, но все же, вот оно:
CREATE TABLE foo(x int);
CREATE TABLE bar(y int) INHERITS (foo);
INSERT INTO foo(x) VALUES(1);
INSERT INTO bar(x,y) VALUES(2,3);
SELECT foo.*, bar.y
FROM foo LEFT OUTER JOIN bar ON (foo.x = bar.x);
Запись только в родительском элементе имеет значение null для y, что должно будетпринять во внимание, но это действительно вытащить все данные.Недостатком здесь является то, что вам нужно специально назвать дополнительные столбцы из дочерних таблиц.(Хотя я считаю, что лучше всего избегать использования * в запросах, которые входят в код.)
Если вы действительно не хотите называть столбцы в дочерней таблице, есть статья о том, как выбратьвсе, кроме определенных столбцов здесь .Вы можете выяснить, как соединить их вместе.
РЕДАКТИРОВАТЬ:
В случае, если y может быть установлен на ноль, и важно различать, что является законным бар у ноль и неligitimate foo y null, вы можете попробовать это вместо этого:
SELECT 'foo' AS from_table, *, NULL::int AS y
FROM ONLY foo
UNION
SELECT 'bar' AS from_table, *
FROM bar;
Затем в конце кода вы можете использовать столбец таблицы from для обработки того, что пришло откуда и сказать, какие нулевые значения y являются допустимыми, а какие нет.