2017-04-01 126 views
2

我有一個數據庫,其中包含有關合唱團(分爲多個部分)和他們的父母成員的信息。我需要建立一個電子郵件列表,其中包含合唱團特定部分的所有孩子以及他們的父母。尋找父母的孩子的財產

有一個大表COMPersonen其中包含我需要的所有個人信息(尤其是他們的ID號碼Nummer和主要電子郵件地址Serienbrief E-Mail Adresse)。

另一個表COMPBereiche包含某個人在某個特定時間屬於哪個合唱團的哪個部分(Bereich (Nr))的所有細節。它通過Nummer/Person (Nr)鏈接到主表。 [Bis](=「until」)字段可用於通過檢查該字段是空的還是設置爲未來的日期來確定某個人當前是否爲部門成員。

最後(至少爲此目的)有一個表​​,其中包含所有父母的身份證號碼(Elternteil (Nr))及其子女的身份證號碼(Kind (Nr))。當然,每個家長可以有不止一個孩子,反之亦然。

到目前爲止,這是非常簡單的。在訪問中,關係是這樣的:

Database relations

最簡單的部分是構建返回在合唱團的特定部分孩子的所有地址(例如部分與ID Bereich (Nr) = 4)查詢:

SELECT COMPersonen.Nummer, COMPersonen.[Serienbrief E-Mail Adresse], 
     COMPBereiche.[Bereich (Nr)], COMPBereiche.Bis 
FROM COMPersonen 
INNER JOIN COMPBereiche ON COMPersonen.[Nummer] = COMPBereiche.[Person (Nr)] 
WHERE (((COMPersonen.[Serienbrief E-Mail Adresse]) Is Not Null) 
AND ((COMPBereiche.[Bereich (Nr)])=4) 
AND ((COMPBereiche.[Bis]) Is Null Or (COMPBereiche.[Bis])>=Date())); 

但現在我還需要父母他們的孩子都在此刻的合唱團第4節的地址。我會怎麼做呢?最後,兩個SELECT陳述將需要結合,但我的猜測是,這是一個簡單的UNION,對吧?

+0

你能使用使用現有查詢子查詢? '選擇persons.email作爲parent_email其中child_id在(選擇id從my_existing_query)' – GGGforce

+0

聽起來似乎合理,我只需要找到一種方法去'child_id' ...讓我的嘗試... –

+0

你想只有父母孩子在第4節?或者你需要在你的查詢分隔行?或像父母,電子郵件,孩子,電子郵件一樣的行? – Vecchiasignora

回答

1

你認爲這太簡單了嗎?

首先查詢(小孩):

SELECT p.*, b.[Bereich (Nr)] 
FROM COMPBereiche b INNER JOIN COMPersonen p ON b.[Person (Nr)] = p.Nummer 
WHERE b.[Bereich (Nr)] = 1001 
AND (b.Bis IS NULL OR b.Bis >= '2016-01-01') 
and p.[Serienbrief E-Mail Adresse] IS NOT NULL 

第二個查詢(家長):

SELECT DISTINCTROW e.* 
FROM ((COMPBereiche b INNER JOIN COMPersonen p ON b.[Person (Nr)] = p.Nummer) 
INNER JOIN COMElternKind k ON p.Nummer = k.[Kind (Nr)]) 
INNER JOIN COMPersonen e ON e.Nummer = k.[Elternteil (Nr)] 
WHERE b.[Bereich (Nr)] = 1001 
AND (b.Bis IS NULL OR b.Bis >= '2016-01-01') 
AND e.[Serienbrief E-Mail Adresse] IS NOT NULL 
+0

測試字段名稱,可能存在拼寫錯誤的地方。 –

+0

難道我拼寫ElternTeil資本T?你把它寫成「Elternteil」 –

+0

你必須把它分解成碎片,然後從一個小的'select * from COMPBereiche'開始;如果它有效(它會!)添加where子句的前兩部分(注意別名'b',它必須在'from'子句中引入),然後開始逐個添加連接。讓我知道它工作的是哪一點,什麼時候開始崩潰(我沒有安裝MS Access,所以這是我能做的最好的)。 –

1

每位父母+子女,其有孩子在你的邏輯,行數將等於孩子們指望

select prnt.[Nummer] as parentnum, prnt.[Serienbrief E-Mail Adresse] as parentemail, 
      prnt.[Bereich (Nr)] parentBereinch, prnt.[Bis] parentBis, chld.* 
      from COMPersonen prnt 
    INNER JOIN COMelternKind cmk, ON prnt.[Person (Nr)] = cmk.[Elternteil (Nr)] 
    INNER JOIN 
    (SELECT COMPersonen.Nummer as chldnum, COMPersonen.[Serienbrief E-Mail Adresse], 
      COMPBereiche.[Bereich (Nr)], COMPBereiche.Bis 
    FROM COMPersonen 
    INNER JOIN (COMPersonenRel1 
     INNER JOIN COMPBereiche 
     ON COMPersonenRel1.[Person (Nr)] = COMPBereiche.[Person (Nr)]) 
    ON COMPersonen.[Nummer] = COMPersonenRel1.[Person (Nr)] 
    WHERE (((COMPersonen.[Serienbrief E-Mail Adresse]) Is Not Null) 
    AND ((COMPBereiche.[Bereich (Nr)])=4) 
    AND ((COMPBereiche.[Bis]) Is Null Or (COMPBereiche.[Bis])>=Date()))) chld 
ON cmk.[Kind (Nr)]) = chld.[chldnum] 

每一位家長誰在你的邏輯孩子,行數將只有父母算

select * from COMPersonen prnt 
    INNER JOIN COMelternKind cmk, ON prnt.[Person (Nr)] = cmk.[Elternteil (Nr)] 

    where exists (SELECT COMPersonen.Nummer as chldnum, COMPersonen.[Serienbrief E-Mail Adresse], 
      COMPBereiche.[Bereich (Nr)], COMPBereiche.Bis 
    FROM COMPersonen 
    INNER JOIN (COMPersonenRel1 
     INNER JOIN COMPBereiche 
     ON COMPersonenRel1.[Person (Nr)] = COMPBereiche.[Person (Nr)]) 
    ON COMPersonen.[Nummer] = COMPersonenRel1.[Person (Nr)] 
    WHERE ((COMPersonen.Nummer = cmk.[Kind (Nr)]) 
    AND ((COMPersonen.[Serienbrief E-Mail Adresse]) Is Not Null) 
    AND ((COMPBereiche.[Bereich (Nr)])=4) 
    AND ((COMPBereiche.[Bis]) Is Null Or (COMPBereiche.[Bis])>=Date()))) 
+0

感謝您幫助我更好地理解問題。我沒有得到你的解決方案,也許是因爲MSSQL語法的怪癖,但我非常感謝你的輸入。 –