406 lines
8.9 KiB
Groff
406 lines
8.9 KiB
Groff
.TH jointable "" "" "/rdb Command"
|
|
.PC "Join two tables into one where keys match"
|
|
\fBjointable [\-a[1|2]] [\-j[1|2] \fIcolumn\fB]... \-n \-] \fItable1 \fB[\fItable2\fB]\fR
|
|
.PP
|
|
.II "table^join two t."
|
|
.II "join tables"
|
|
The command
|
|
.B jointable
|
|
joins
|
|
.I table1
|
|
to
|
|
.I table2
|
|
on
|
|
.IR column ,
|
|
which is common to both tables (called the \fIkey column\fR).
|
|
If no
|
|
.I column
|
|
is named,
|
|
.B jointable
|
|
assumes that the first column in each table is the key column.
|
|
.PP
|
|
Each table must be sorted on the key column.
|
|
.B jointable
|
|
writes a new table that has one row for the rows in the tables
|
|
whose values in the key column match.
|
|
The columns of the new table are all the columns in
|
|
.I table1
|
|
followed by all the columns in
|
|
.IR table2 \(em
|
|
with the sole exception that the key column is not repeated.
|
|
.PP
|
|
This is called a
|
|
.IR "natural join" .
|
|
An
|
|
.I equi-join
|
|
repeats the key column.
|
|
.PP
|
|
The COHERENT system's command
|
|
.B join
|
|
will also join two tables in the manner described above, but
|
|
it does not know about
|
|
.B /rdb
|
|
head lines.
|
|
.SH "String vs. Numeric Sort"
|
|
The commonest problem seen with
|
|
.B jointable
|
|
is when users attempt to join tables that have been sorted
|
|
.I numerically
|
|
on the key columns (that is, the columns
|
|
that the tables are going to be joined on).
|
|
They use
|
|
.B sorttable
|
|
with the
|
|
.B \-n
|
|
option (for numeric) to sort a table, then call
|
|
.B jointable.
|
|
.BR jointable ,
|
|
however, expects to see a
|
|
.I "string sort"
|
|
fails to join the tables correctly.
|
|
.PP
|
|
The following compares a string sort with a numeric sort:
|
|
.DS
|
|
.ta 0.5iC 2.0iC
|
|
\fIString Numeric\fR
|
|
1 1
|
|
10 2
|
|
2 10
|
|
20 20
|
|
.DE
|
|
.PP
|
|
Can you see why?
|
|
Numeric is the way we count and is obviously correct.
|
|
But string sort looks at the first character, then the second.
|
|
A space sorts ahead of `0', so `1' comes before ``10''.
|
|
More importantly, `1' comes before `2'
|
|
regardless of the characters to the right.
|
|
That is why ``10'' comes before ``2'' followed by a space.
|
|
This problem shows up as empty output from a
|
|
.BR jointable ,
|
|
when you know some of the rows should be joined.
|
|
.PP
|
|
Right-justification makes numeric and string sorts the same.
|
|
The leading spaces help the string sort to sort numbers correctly.
|
|
.PP
|
|
To make it easy for users to avoid this problem,
|
|
.B jointable
|
|
has the option
|
|
.BR \-n ,
|
|
for symmetry with the COHERENT command
|
|
.BR sort .
|
|
.PP
|
|
If you want to join two tables through a numeric key column,
|
|
you must either call the
|
|
.B sorttable
|
|
without its
|
|
.B \-n
|
|
numeric sort option, so that
|
|
it defaults to string sort;
|
|
or if you use the
|
|
.B \-n
|
|
option for
|
|
.BR sorttable ,
|
|
be sure to use it also with
|
|
.BR jointable .
|
|
.SH Options
|
|
.B jointable
|
|
recognizes the following options:
|
|
.IP \fB\-a\fIn\fR
|
|
All or one of the files (1 or 2) is output,
|
|
whether it matches or not.
|
|
In addition to the normal output,
|
|
.B jointable
|
|
produces a line for each unpairable line in file
|
|
.IR n ,
|
|
where
|
|
.I n
|
|
is 1 or 2.
|
|
For example, the command
|
|
.DM
|
|
jointable -a1 ledger chart
|
|
.DE
|
|
.sp \n(pDu
|
|
forces
|
|
.B jointable
|
|
to print every row in table
|
|
.BR ledger ,
|
|
regardless of whether any value in
|
|
.BR ledger 's
|
|
.B Account
|
|
column matches any value in
|
|
.BR chart 's
|
|
.B Account
|
|
column.
|
|
.IP "\fB\-j\fIn column\fR
|
|
Join on the
|
|
.I column
|
|
column in table number
|
|
.I n.
|
|
If
|
|
.I n
|
|
is missing, use the
|
|
.I column
|
|
column in each table.
|
|
For example, the command
|
|
.DM
|
|
jointable -j1 Account -j2 account ledger chart
|
|
.DE
|
|
.sp \n(pDu
|
|
joins tables
|
|
.B ledger
|
|
and
|
|
.B chart
|
|
using the
|
|
.B Account
|
|
column in
|
|
.B ledger
|
|
and the
|
|
.B account
|
|
column in
|
|
.BR chart .
|
|
If no columns are specified with this option,
|
|
.B jointable
|
|
joins the tables by the first column in each.
|
|
Thus, this option lets you join on any column defined
|
|
in either file, even when they have different names and locations.
|
|
.IP \fB-n\fR
|
|
Numeric join.
|
|
This means that table1 and table2 were sorted with the numeric option
|
|
.BR \-n .
|
|
Remember that if you use
|
|
.B \-n
|
|
with the command
|
|
.BR sorttable ,
|
|
you must also use
|
|
it with
|
|
.BR jointable .
|
|
.IP \fB\-\fR
|
|
Read the standard input in place of a table.
|
|
For example, the command
|
|
.DM
|
|
sorttable < journal | jointable - chart
|
|
.DE
|
|
.sp \n(pDu
|
|
means to sort table
|
|
.BR journal ,
|
|
then join it with table
|
|
.B chart
|
|
so that
|
|
.B journal
|
|
is on the left of the output table and
|
|
.B chart
|
|
is on the right.
|
|
.sp \n(pDu
|
|
Note that this option is used only in place of
|
|
.IR table1 .
|
|
If
|
|
.I table2
|
|
is absent from the command line,
|
|
.B jointable
|
|
automatically reads the standard input for that table's data.
|
|
.PP
|
|
Note that most of these options are about
|
|
the same as for the COHERENT command
|
|
.BR join .
|
|
.SH Example
|
|
Consider table
|
|
.BR chart ,
|
|
as follows:
|
|
.DM
|
|
Account Name
|
|
------- ----
|
|
100 Assets
|
|
101 Cash
|
|
111 Accounts Receivable
|
|
111.1 Allowance for Bad Debt
|
|
115 Notes Receivable
|
|
120 Deposits
|
|
130 Parts Inventory
|
|
...
|
|
.DE
|
|
.PP
|
|
and table
|
|
.BR ledger ,
|
|
as follows:
|
|
.DM
|
|
Account Date Debit Credit
|
|
------- ---- ----- ------
|
|
101 820102 25000
|
|
101 820103 5000
|
|
101 820104 15000
|
|
130 820104 30000
|
|
150.1 820103 10000
|
|
201.1 820104 15000
|
|
211.1 820102 25000
|
|
211.2 820103 5000
|
|
.DE
|
|
.PP
|
|
Note that each is sorted in string fashion on its first column.
|
|
To join them, use the command:
|
|
.DM
|
|
jointable ledger chart
|
|
.DE
|
|
.PP
|
|
This joins the tables on the first column in each, and writes the
|
|
following to the standard output:
|
|
.DM
|
|
Account Date Debit Credit Name
|
|
------- ---- ----- ------ ----
|
|
101 820102 25000 Cash
|
|
101 820103 5000 Cash
|
|
101 820104 15000 Cash
|
|
130 820104 30000 Parts Inventory
|
|
150.1 820103 10000 Test equipment
|
|
211.1 820102 25000 Notes Payable - BA
|
|
211.2 820103 5000 Notes Payable - Z Equip
|
|
.DE
|
|
.PP
|
|
As you can see, column
|
|
.B Name
|
|
has been added to the columns of the
|
|
.B ledger
|
|
table, and that column
|
|
.B Account
|
|
is not repeated.
|
|
Also note that
|
|
.B jointable
|
|
wrote only the rows whose values in column
|
|
.B Account
|
|
match.
|
|
If a table has several rows with repeated key values (e.g., the
|
|
three
|
|
.BR 101 s
|
|
in the
|
|
.B Account
|
|
column), the joined table's rows are also repeated (see the three
|
|
.BR Cash s
|
|
in column
|
|
.BR Name ).
|
|
.PP
|
|
If you have a table named
|
|
.B journal
|
|
that is sorted on column
|
|
.BR Account ,
|
|
as follows
|
|
.DM
|
|
Date Account Debit Credit
|
|
---- ------- ----- ------
|
|
820104 101 15000
|
|
820103 101 5000
|
|
820102 101 25000
|
|
820104 130 30000
|
|
820103 150.1 10000
|
|
820104 201.1 15000
|
|
820102 211.1 25000
|
|
820103 211.2 5000
|
|
.DE
|
|
.PP
|
|
you could join it with table
|
|
.B chart
|
|
by typing this command:
|
|
.DM
|
|
jointable -j Account journal chart
|
|
.DE
|
|
.PP
|
|
The following gives
|
|
another way for the same result (because
|
|
.BR chart 's
|
|
join column defaults to column 1):
|
|
.DM
|
|
jointable -j1 Account journal chart
|
|
.DE
|
|
.PP
|
|
Both commands produce the following output:
|
|
.DM
|
|
Date Account Debit Credit Name
|
|
------ ------- ----- ------ ----
|
|
820104 101 15000 Cash
|
|
820103 101 5000 Cash
|
|
820102 101 25000 Cash
|
|
820104 130 30000 Parts Inventory
|
|
820103 150.1 10000 Test equipment
|
|
820102 211.1 25000 Notes Payable - Bank of Amerigold
|
|
820103 211.2 5000 Notes Payable - Z Equipment
|
|
.DE
|
|
.PP
|
|
The
|
|
.B \-a
|
|
option lets you see all of one table whether or not there is a match.
|
|
For example, the command
|
|
.DM
|
|
jointable -a1 ledger chart
|
|
.DE
|
|
.PP
|
|
writes the following:
|
|
.DM
|
|
Account Date Debit Credit Name
|
|
------- ---- ----- ------ ----
|
|
101 820102 15000 Cash
|
|
101 820103 5000 Cash
|
|
101 820104 25000 Cash
|
|
130 820104 30000 Parts Inventory
|
|
150.1 820103 10000 Test equipment
|
|
201.1 820104 15000
|
|
211.1 820102 25000 Notes Payable - Bank of Amerigold
|
|
211.2 820103 5000 Notes Payable - Z Equipment
|
|
.DE
|
|
.PP
|
|
Note that column
|
|
.BR Account 's
|
|
value
|
|
.B 201.1
|
|
in the ledger shows up here, even though it is not in
|
|
.BR chart .
|
|
This shows us that
|
|
.B 201.1
|
|
is an error.
|
|
All account numbers should be in the chart of accounts.
|
|
We should either add
|
|
.B 201.1
|
|
to the chart of accounts, or find
|
|
the correct number in the chart of accounts and replace
|
|
.B 201.1
|
|
in the
|
|
.B journal
|
|
with the correct account number.
|
|
.PP
|
|
If you pipe a file into a
|
|
.BR jointable ,
|
|
you can control which table it will be (first or second) by using the
|
|
dash option.
|
|
For example:
|
|
.DM
|
|
sorttable Account < journal | jointable -j Account - chart
|
|
.DE
|
|
.PP
|
|
This produces the following output:
|
|
.DM
|
|
Date Account Debit Credit Name
|
|
---- ------- ----- ------ ----
|
|
820103 101 5000 Cash
|
|
820104 101 15000 Cash
|
|
820102 101 25000 Cash
|
|
820104 130 30000 Parts Inventory
|
|
820103 150.1 10000 Test equipment
|
|
820102 211.1 25000 Notes Payable - Bank of Amerigold
|
|
820103 211.2 5000 Notes Payable - Z Equipment
|
|
.DE
|
|
.PP
|
|
Note the
|
|
.B \-
|
|
before
|
|
.BR chart .
|
|
It says that the standard input file
|
|
will be file 1 or on the left side of the table.
|
|
.SH "See Also"
|
|
.B
|
|
column,
|
|
sorttable
|
|
.R
|
|
.br
|
|
COHERENT Lexicon:
|
|
.B
|
|
join
|
|
.R
|