我有一个简单的地址簿类型的数据库。我可能已经过度正常化,但它与生产力一样多,而且正在学习。
我有一个表,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%,但只要它是学习成绩,我希望有人可以帮助我。
答案 0 :(得分:1)
将此where子句添加到临时表查询中。几乎所有这些类型的AB / BA问题都可以通过类似的比较来解决。
WHERE P2.ID IS NULL OR P1.ID < P2.ID