SQL:排除常见数据

时间:2011-12-11 05:23:36

标签: sql db2

我有一个简单的地址簿类型的数据库。我可能已经过度正常化,但它与生产力一样多,而且正在学习。

我有一个表,PEOPLE,带有ID(生成的标识),名字/姓氏,标题等。在其自己的表中的ID字段上还有一个外键“配偶”。显然,可以为空。

我有一张表,ADDRESSES,带有ID(生成的身份),以及蜗牛邮件所需的所有详细信息。

我有一个PERSONADDRESS表,有两个外键,PERSON指向PEOPLE.ID,ADDRESS指向ADDRESSES.ID。

理论上,我将有一个EMAILS表,其中包含PEOPLE的外键和电子邮件。从理论上讲,人们(像我这样的极客)可以拥有多个电子邮件。以及未来类似数据之间的其他关系。 (PHONES等)。

所以,问题就是这个问题。我想制作一些地址标签。 (是的,对于圣诞贺卡来说,它有点迟了。)所以,为了让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
;

然而,这意味着如果A和B人结婚,我将获得一个条目,其中A出现在ATITLE,AGIVEN,ALAST下,B是BTITLE,BGIVEN,BLAST,以及另一个条目扭转了立场。这种区别显然不起作用,因为它们只是在不同的列中。我无法想象我需要进行这项排除所需的更改。

请注意,将两个人中的一个与地址断开连接(这对于这个特定问题来说是一个简单的解决方案)将与一般的表数据概念背道而驰:为了任何目的而保留所有这些关系,然后提取我的内容我需要的时候需要它。当然,此时它的标签是90%,但只要它是学习成绩,我希望有人可以帮助我。

1 个答案:

答案 0 :(得分:1)

将此where子句添加到临时表查询中。几乎所有这些类型的AB / BA问题都可以通过类似的比较来解决。

WHERE P2.ID IS NULL OR P1.ID < P2.ID