我有一个包含多个表(人物,父母等)的数据库
人员表具有某些属性,特别是ssn,countryofbirth和currentcountry。
父母表有ssn和fathersbirthcountry
ssn in Person与父母中的ssn相同 - 这就是他们的联系方式。
我正在努力输出所有与他们的父亲生育国家相同的国家分娩的人的SSN,并且他们也拥有与父亲生育国家相同的当前国家。
SELECT Person.ssn
FROM Person, Parents
WHERE fathersbirthcountry = countryofbirth
AND currentcountry = fathersbirthcountry;
以上似乎没有用,有人可以帮帮我吗?
答案 0 :(得分: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
答案 1 :(得分:0)
你永远不会提到人们如何存储其对父母的引用。我假设在Person表中有一个MotherId和FatherId,所以你会得到:
Select SSN
From Person
Where BirthCountry = (
Select BirthCountry
From Parents
Where Person.FatherId = Parents.Id
)
现在,假设Person表中的BirthCountry与Parents表中的BirthCountry相同。