У меня есть простая база данных типа адресной книги. Я, вероятно, чрезмерно нормализовался, но это касается как производительности, так и обучения.
У меня есть таблица PEOPLE с идентификатором (сгенерированным идентификатором), именем / фамилией, названием и т. Д. Также имеется внешний ключ "супруга" в поле идентификатора в своей таблице. Очевидно, обнуляемый.
У меня есть таблица, АДРЕСА, с идентификатором (сгенерированным идентификатором) и всеми данными, необходимыми для обычной почты.
У меня есть таблица PERSONADDRESS с двумя внешними ключами, PERSON указывает на PEOPLE.ID и ADDRESS указывает на ADDRESSES.ID.
Теоретически, у меня будет таблица EMAILS с внешним ключом для PEOPLE и электронная почта. Теоретически, люди (такие же, как я) могут иметь более одного электронного письма. И другие отношения между подобными данными в будущем. (Телефоны и пр.).
Итак, проблема в следующем. Я хочу произвести некоторые адресные метки. (Да, для рождественских открыток становится немного поздно.) Итак, чтобы заставить Libreoffice сделать это, я думаю, что мне нужно создать представление, из которого LO может читать свои данные, из которого каждое поле, которое я хочу выложить, уже доступно.
Это достаточно просто, за исключением того, что в данный момент у меня слишком много дублирования. Мой вид создан так:
CREATE OR REPLACE VIEW ADDRBOOK.LABELS AS
WITH T AS (
SELECT DISTINCT
P1.ID AS AID,
P1.TITLE AS ATITLE, P1.GIVENNAME AS AGIVEN, P1.LASTNAME AS ALAST,
P2.TITLE AS BTITLE, P2.GIVENNAME AS BGIVEN, P2.LASTNAME AS BLAST,
A.STREET, A.MUNICIPALITY, A.STATE, A.COUNTRY, A.POSTALCODE
FROM
ADDRBOOK.ADDRESSES A
JOIN
ADDRBOOK.PERSONADDR PA
ON PA.ADDRESS = A.ID
JOIN
ADDRBOOK.PEOPLE P1
ON PA.PERSON = P1.ID
LEFT OUTER JOIN
ADDRBOOK.PEOPLE P2
ON P1.SPOUSE = P2.ID
ORDER BY P1.ID
)
SELECT DISTINCT
ATITLE, AGIVEN, ALAST,
BTITLE, BGIVEN, BLAST,
STREET, MUNICIPALITY, STATE, COUNTRY, POSTALCODE
FROM T
;
Однако это означает, что если люди А и В состоят в браке, я получу одну запись, где А отображается под ATITLE, AGIVEN, ALAST, а B - БИТЛ, BGIVEN, BLAST и другую запись, где они поменял позиции. Очевидно, что отличное не работает, потому что они просто в разных столбцах. У меня проблемы с представлением изменений, которые мне понадобятся, чтобы сделать это исключение.
Обратите внимание, что отключение одного из двух людей от адреса, что было бы простым решением для этой конкретной проблемы, противоречило бы общему понятию данных таблицы: хранить все эти отношения для любой цели, а затем извлекать то, что я нужно, когда мне это нужно. Конечно, на данный момент это 90% ярлыков, но пока это учебное упражнение, я надеюсь, что кто-нибудь может мне помочь.