SQL: исключая общие данные - PullRequest
1 голос
/ 11 декабря 2011

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

У меня есть таблица 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% ярлыков, но пока это учебное упражнение, я надеюсь, что кто-нибудь может мне помочь.

1 Ответ

1 голос
/ 11 декабря 2011

Добавьте это предложение where к вашему запросу к временной таблице. Почти все эти типы проблем AB / BA могут быть решены с помощью аналогичного сравнения.

WHERE P2.ID IS NULL OR P1.ID < P2.ID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...