Postgres: выбор данных из родительской таблицы и всех дочерних таблиц - PullRequest
2 голосов
/ 02 февраля 2012

У меня есть родительская таблица и несколько дочерних таблиц, структура которых немного отличается от родительской и друг от друга.я могу собрать запрос, который получает все данные из родительской таблицы и всех дочерних таблиц со всеми дополнительными столбцами?

Ответы [ 3 ]

1 голос
/ 19 ноября 2014

Похоже, что вам здесь нужно использовать левое внешнее соединение.Опять же, не идеальное решение и, возможно, изменение структуры базы данных было бы лучше, но все же, вот оно:

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 являются допустимыми, а какие нет.

1 голос
/ 02 февраля 2012

Используйте правильную схему и используйте INHERITS, чтобы сообщить PostgreSQL о структуре:

CREATE TABLE foo(x int);

CREATE TABLE bar(y int) INHERITS (foo); -- <===

INSERT INTO foo(x) VALUES(1); -- one record
INSERT INTO bar(x,y) VALUES(2,3); -- one record

SELECT * FROM foo; -- two results

SELECT * FROM ONLY foo; -- one result, see ONLY

http://www.postgresql.org/docs/current/interactive/ddl-inherit.html

0 голосов
/ 13 ноября 2013

Простой ответ: вы не можете легко это сделать.У вас не может быть неровных строк (в отличие от Informix), поэтому простой подход выбора не сработает.

Возможно, вы сможете программно создать запрос, который будет использовать row_to_json и несколько операторов объединения, но этоЭто много работы, очень сложная, и, возможно, не то, что вы хотите.он также не учитывает случаи, когда столбцы могут иметь одинаковые имена, но разные значения в разных дочерних таблицах.

В общем, я думаю, что вам необходимо переосмыслить свой подход здесь.Если вы пытаетесь полагаться на неровные строки, у вас будет много очень слабых контрактов между вашим приложением и базой данных, и поэтому у вас будет большой потенциал для решения уникальных проблем.

Лучший подходздесь нужно переместить дополнительные столбцы в таблицы соединений, где вы можете использовать left join для их извлечения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...