2011-12-11 42 views
1

我有一個簡單的地址簿類型的數據庫。我可能已經過度標準化了,但它與生產力一樣重要。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,我希望有人能幫助我在這裏。

回答

1

將此子句添加到您的臨時表查詢中。幾乎所有這些類型的AB/BA問題都可以通過類似的比較來解決。

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

這不一定是我想要的所有情況下的順序,但它可以與某些方面合作,例如,我可以逆轉ID的順序或其他。謝謝! – Tanktalus

+1

要考慮的其他事項... head_of_household字段可能會有用。如果你打算擴大這種關係來管理其他類型的關係(配偶,兄弟姐妹,父母,孩子,教會,俱樂部成員等),那麼可能更有必要將配偶從人羣中剝離出來並管理所有關係RELATIONSHIP表。 – phatfingers