通过孩子的财产找到父母

时间:2017-04-01 10:43:14

标签: sql sql-server ms-access

我有一个数据库,其中包含有关合唱团成员(分为部分)及其父母的信息。我需要建立一个电子邮件列表,其中包含合唱团特定部分的所有孩子以及他们的父母。

有一个大表COMPersonen,其中包含我需要的所有个人信息(尤其是他们的ID号Nummer和主电子邮件地址Serienbrief E-Mail Adresse)。

另一张表COMPBereiche包含某个人在某个时间属于哪个合唱团(Bereich (Nr))的所有细节。它通过Nummer / Person (Nr)与主要表格相关联。 [Bis](=“until”)字段可用于通过检查该字段是空的还是设置为将来的日期来确定某人当前是否为部门成员。

最后(至少为此目的),有一个表COMElternKind,其中包含所有父母的身份证号码(Elternteil (Nr))以及他们孩子的身份证号码(Kind (Nr)) 。当然,每个家长可以有一个以上的孩子,反之亦然。

到目前为止,这非常简单。在Access中,关系看起来像这样:

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,对吗?

2 个答案:

答案 0 :(得分:1)

每个父母+孩子在你的逻辑中都有孩子,rowcount将等于孩子数

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]

每个在您的逻辑中都有子项的父级,rowcount将只有父级计数

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())))

答案 1 :(得分: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