Previous: Foreign Keys, Up: Queries which Join Records


11.2 Joining Records

The above example has also added a new field to the Person record set to contain that person's mobile phone number. Note that the Telephone field belongs to the Residence record set because that contains the telephone number of the home, whereas Mobile belongs to Person since mobile telephones are normally used exclusively by one individual.

If we want to look up the name and address of a person in our recfile, we can use recsel as before. Because we now have more than one record set in the acquaintances.rec file, we have to tell recsel in which record set we want to look up records. We do this with the -t flag as follows:

     $ recsel -t Person -P Name,Abode acquaintances.rec
     Alfred Nebel
     42AbbeterWay
     
     Mandy Nebel
     42AbbeterWay
     
     Bertram Nebel
     42AbbeterWay
     
     Charles Spencer
     2SerpeRise
     
     Dirk Spencer
     2SerpeRise
     
     Ernest Wright
     ChezGrampa

This result tells us the names of all the people in the recfile, as well as giving a concise and hopefully effective reminder telling us where they live. However these results would not be useful to someone unacquainted with the individuals. They need a list of names and full addresses. We can use recsel to produce such a list:

     $ recsel -t Person -j Abode acquaintances.rec
     Name: Charles Spencer
     Dob: 4 July 1997
     Email: charlie@example.com
     Abode_Address: 2 Serpe Rise, Little Worning, SURREY
     Abode_Telephone: 09876 5432109
     Abode_Id: 2SerpeRise
     
     Name: Dirk Spencer
     Dob: 29 June 1945
     Email: dirk@example.com
     Mobile: 0555 342123
     Abode_Address: 2 Serpe Rise, Little Worning, SURREY
     Abode_Telephone: 09876 5432109
     Abode_Id: 2SerpeRise
     
     Name: Ernest Wright
     Dob: 26 April 1978
     Abode_Address: 1 Wanter Rise, Greater Inncombe, BUCKS
     Abode_Id: ChezGrampa

The -t flag we have seen before. It tells recsel that we want to extract records of type Person. The -j flag is new. It says that we want to perform a join. Specifically we want to join the Person records according to their Abode field.

In the above example, recsel displays several field names which do not appear anywhere in the input e.g. Abode_Address. This is the Address field in the record joined by the foreign key Abode. In this example probably only the name and address are of interest. The other information such as date of birth is incidental. The foreign key Abode_Id is certainly not wanted in the output since it is redundant. As usual, you can use the -P or -p options to limit the fields which will be displayed. However the full joined field name, if appropriate, must be specified. So the names and addresses without the other information can be retrieved thus:

     $ recsel -t Person -j Abode -p Name,Abode_Address acquaintances.rec
     Name: Charles Spencer
     Abode_Address: 2 Serpe Rise, Little Worning, SURREY
     
     Name: Dirk Spencer
     Abode_Address: 2 Serpe Rise, Little Worning, SURREY
     
     Name: Ernest Wright
     Abode_Address: 1 Wanter Rise, Greater Inncombe, BUCKS