Composing FROM Clause
In most cases, it is not necessary to deal explicitly with FROM entries while using class RWDBSelector, as they can be deduced from the columns to be selected and those referenced in the instance of RWDBCriterion set for the WHERE clause. However, in certain circumstances it might be desirable to manipulate the FROM clause. For example, when using RWDBJoinExpr, correlated sub-queries, or when adding an unreferenced table. RWDBSelector provides methods — from(), fromClear(), fromGeneration(), fromExtern(), and fromExternClear() — to manipulate the FROM clause generation.
The list of the FROM entries deduced from the select column list and the WHERE criterion forms the implicit FROM entries list. Use of from() methods forms the explicit FROM entries list. Each invocation of a from() method adds an entry to the explicit FROM entries list. Method fromClear() may be used to clear the explicit FROM entries list.
The enumeration FromGeneration defines the behavior used to compose the FROM clause from the implicit and explicit FROM entries lists. The two values the enum defines are ExplicitOrImplicit and ExplicitAndImplicit. The enum ExplicitOrImplicit composes the FROM clause based on the explicit FROM entries list if there are any entries; otherwise it uses the implicit FROM entries list. Thus, it results in the use of entries in either explicit or implicit lists, but not both. The enum ExplicitAndImplicit composes the FROM clause as a union of the implicit and explicit FROM entries lists. It combines entries from both the lists, removing duplicate entries. It also removes the table entries that are a part of a join expression included in the explicit list. The fromGeneration()methods act as get and set methods for defining the behavior. Default behavior is ExplicitOrImplicit.
If a table is in the implicit FROM list, but should not be included in the FROM clause, it should be marked external by using the method fromExtern(). A table marked external using fromExtern() is assumed to have been defined outside the query and hence will not be included in the FROM clause. For example, in a correlated sub-query, a table defined in the outer SQL is used inside the sub-query. The sub-query should not define the table, as the table definition is external to the sub-query. (See Subqueries.). Every call to fromExtern() adds a table to the extern table list. Method fromExternClear() may be used to clear the extern table list.
In the following example, myDbase is a valid RWDBDatabase instance, t1 through t6 are valid RWDBTable instances, and j1 is a valid RWDBJoinExpr instance joining tables t5 and t6.
 
RWDBTable t1, t2, t3, t4, t5, t6;
... // Define valid RWDBTables t1, t2, t3, t4, t5, t6
RWDBJoinExpr j1 = rwdbLeftOuter(t5, t6);
... // Define the rest of the RWDBJoinExpr j1
 
RWDBSelector sel1 = myDbase.selector();
sel1 << t1["col"] << t2["col"] << t3["col"];
sel1.fromExtern(t2);
... // Define rest of the RWDBSelector sel1
 
RWDBSelector sel2 = myDbase.selector();
sel2 << t4["col"] << t5["col"] << t6["col"];
sel2.from(j1);
sel2.from(t4);
... // Define the rest of the RWDBSelector sel2
 
RWDBSelector sel3 = myDbase.selector();
sel3.fromGeneration(RWDBSelector::ExplicitAndImplicit);
sel3 << t1["col"] << t2["col"] << t3["col"];
sel3 << t5["col"] << t6["col"];
sel3.from(j1);
sel3.from(t4);
sel3.externFrom(t2);
... // Define the rest of the RWDBSelector sel3
RWDBSelector sel1 has by default the FROM clause generation behavior of ExplicitOrImplicit. Since no explicit from() entries are added, the FROM clause is generated using the implicit list, consisting of tables t1, t2 and t3 from the select column list. However since table t2 is marked as external, the FROM clause will have tables t1 and t3 only.
RWDBSelector sel2 also has by default the FROM clause generation behavior of ExplicitOrImplicit. Since explicit from() entries are added, the FROM clause is generated using the explicit list, consisting of join expression j1 and table t4.
RWDBSelector sel3 has the FROM clause generation behavior of ExplicitAndImplicit. The implicit list has entries for tables t1, t2, t3, t5 and t6 from the select column list. The from() calls have created the explicit list of join expression j1 and table t4. The union of the two will result in the join expression j1 and tables t1, t2, t3 and t4. Note that tables t5 and t6 are removed as they are part of the join expression j1. Since table t2 is marked as external, the FROM clause will consist of join expression j1 and tables t1, t3 and t4.