Помогите написать запросы к базе данных для дерби? - PullRequest
1 голос
/ 12 марта 2010

У меня есть база данных, содержащая несколько таблиц (Person, Parents и т. Д.)

Таблица Person имеет определенные атрибуты, в частности ssn, countryofbirth и currentcountry.

Таблица родителей содержит ssn и Fathersbirthcountry

ssn in Person - это то же самое ssn в Parents - вот как они связаны.

Я пытаюсь вывести SSN всех людей, которые имеют ту же страну рождения, что и их страна отцов, а такжеиметь ту же страну, что и папа, родная страна.

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

вышеописанное не работает, может кто-нибудь помочь мне?

Ответы [ 2 ]

2 голосов
/ 12 марта 2010

Вам не ясно, какое условие связывает запись Person с родительской записью. В этом примере я предполагаю, что 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
0 голосов
/ 12 марта 2010

Вы никогда не упоминаете, как Person хранит свою ссылку на Родителей. Я предполагаю, что в таблице Person есть MotherId и FatherId, поэтому вы получите:

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

Теперь предполагается, что BirthCountry в таблице Person - это тот же список, что и BirthCountry в таблице Parents.

...