您没有明确将人员记录与父记录联系起来的条件。对于此示例,我将假设 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