1

我有一个包含多个表(人、父母等)的数据库

Person 表具有某些属性,特别是 ssn、countryofbirth 和 currentcountry。

父母表有ssn,和fathersbirthcountry

Person 中的 ssn 与 Parents 中的 ssn 相同 - 这就是它们的链接方式。

我正在尝试输出与父亲出生国家具有相同出生国家并且当前国家与父亲出生国家相同的所有人的 SSN。

SELECT Person.ssn 
FROM Person, Parents 
WHERE fathersbirthcountry = countryofbirth 
AND currentcountry = fathersbirthcountry;

以上似乎不起作用,有人可以帮助我吗?

4

2 回答 2

2

您没有明确将人员记录与父记录联系起来的条件。对于此示例,我将假设 Person 包含一个您未提及的附加字段,称为 FatherSSN。如果是这样:

   SELECT Person.SSN 
   FROM Person, Parents
   WHERE Person.FatherSSN = Parents.SSN
     AND Person.CountryOfBirth = Parents.FathersBirthCountry
     AND Person.CurrentCountry = Parents.FathersBirthCountry

或者,在 SQL-92 JOIN 语法中:

   SELECT Person.SSN 
   FROM Person INNER JOIN Parents
   ON Person.FatherSSN = Parents.SSN
     AND Person.CountryOfBirth = Parents.FathersBirthCountry
     AND Person.CurrentCountry = Parents.FathersBirthCountry

这两个版本应该产生相同的结果(和执行计划)。

最后,如果这是您自己的数据库,则可以轻松且有利地对其进行重构,使其仅具有一个包含所有代的 Person 表,使用与您现在拥有的该单个表完全相同的结构。如果您进行重组,您的 SQL 将如下所示:

   SELECT P1.SSN 
   FROM Person P1 INNER JOIN Parents P2
   ON P1.FatherSSN = P2.SSN
     AND P1.CountryOfBirth = P2.CountryOfBirth
     AND P1.CurrentCountry = P2.CountryOfBirth
于 2010-03-12T02:41:19.727 回答
0

你从来没有提到 Person 是如何存储它对父母的引用的。我假设 Person 表中有一个 MotherId 和 FatherId,所以你会得到:

Select SSN
From Person
Where BirthCountry =    (
                        Select BirthCountry
                        From Parents
                        Where Person.FatherId = Parents.Id
                        )

现在,这假设 Person 表中的 BirthCountry 与 Parents 表中的 BirthCountry 列表相同。

于 2010-03-12T02:37:54.067 回答