2017-04-01 131 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语法的怪癖,但我非常感谢你的输入。 –