我有一個簡單的地址簿類型的數據庫。我可能已經過度標準化了,但它與生產力一樣重要。SQL:排除常見數據
我有一個表,PEOPLE,帶有ID(生成的標識),名字/姓氏,標題等。在其自己的表中的ID字段上還有一個外鍵「配偶」。顯然,可以爲空。
我有一張表,ADDRESSES,帶有一個ID(生成的身份),以及所有蝸牛郵件所需的詳細信息。
我有一個表,PERSONADDRESS,有兩個外鍵,指向PEOPLE.ID的PERSON和指向ADDRESSES.ID的ADDRESS。
理論上,我將有一個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都結婚了,我會得到一個條目,其中一個是顯示ATITLE,AGIVEN,ALAST下了,B是BTITLE,BGIVEN,BLAST以及他們轉換位置的其他條目。獨特的顯然不工作,因爲他們只是在不同的列。我很難想象我需要做這些排除的改變。
請注意,將兩個人中的一個人從地址中斷開,這對於這個特定問題來說是一個簡單的解決方案,它將與一般的表數據概念相反:爲了任何目的而保存所有這些關係,然後提取我需要的時候需要它。當然,在這一點上它是90%的標籤,但只要它是一個學習excersise,我希望有人能幫助我在這裏。
這不一定是我想要的所有情況下的順序,但它可以與某些方面合作,例如,我可以逆轉ID的順序或其他。謝謝! – Tanktalus
要考慮的其他事項... head_of_household字段可能會有用。如果你打算擴大這種關係來管理其他類型的關係(配偶,兄弟姐妹,父母,孩子,教會,俱樂部成員等),那麼可能更有必要將配偶從人羣中剝離出來並管理所有關係RELATIONSHIP表。 – phatfingers