Join table in query parse tree

From the following 3 diagrams, you can have a better understand of TLzJoin , TLzJoinList, TLzJoinItem, TLzJoinItemList which is used to represent join table in from clause.

You can check TSelectSqlStatement.JoinTables which is type of TLzJoinList to start fetching all those information. 

SQL join table SQL join table SQL join table

Scenario 1

Select t1.f1
from my.table1 t1,my.table2 t2
where t1.f1 = t2.f1			
			

After parsing this sql, data in TSelectSqlStatement.Tables is:

Tables.Count = 2;

Tables[0].TableName = 'table1';
Tables[0].TablePrefix = 'my';
Tables[0].TableAlias = 't1';

Tables[1].TableName = 'table2';
Tables[1].TablePrefix = 'my';
Tables[1].TableAlias = 't2';

And information in TSelectSqlStatement.JoinTables is:
JoinTables.Count = 2;

JoinTables.items[0].JoinTableType = jttTable; // the collection of join is table : my.table1
JoinTables.items[0].JoinTable = Tables[0];//my.table1
JoinTables.items[0].JoinItems.count = 0;

JoinTables.items[1].JoinTableType = jttTable; // the collection of join is table : my.table1
JoinTables.items[1].JoinTable = Tables[1];//my.table2
JoinTables.items[1].JoinItems.count = 0;
			

Scenario 2

Select t1.f1
from my.table1 t1
join my.table2 t2
on t1.f1 = t2.f1				
			

After parsing this sql, data in TSelectSqlStatement.Tables is:

Tables.Count = 2;

Tables[0].TableName = 'table1';
Tables[0].TablePrefix = 'my';
Tables[0].TableAlias = 't1';

Tables[1].TableName = 'table2';
Tables[1].TablePrefix = 'my';
Tables[1].TableAlias = 't2';				
			

everything is the same as scenario 1, Now, check the information in JoinTables:

JoinTables.Count = 1;

JoinTables.items[0].JoinTableType = jttTable; // the collection of join is table : my.table1
JoinTables.items[0].JoinTable = Tables[0];//my.table1
JoinTables.items[0].JoinItems.count = 1;

JoinTables.items[0].JoinItems[0].JoinItemTableType = jttTable;//the collection of this joinitem is table:my.table2
JoinTables.items[0].JoinItems[0].JoinItemTable = my.table2;
JoinTables.items[0].JoinItems[0].JoinType = sjtjoin;
JoinTables.items[0].JoinItems[0].JoinQualType = sjqOn;
JoinTables.items[0].JoinItems[0].JoinQual = AEXPRESSION ; //a custom expressoin point to t1.f1 = t2.f1				
			

Scenario 3

select t1.f1
from my.table1 t1
 join (my.table2 t2
 left join my.table3 t3
 on t2.f1 = t3.f1) as joinalias1
 on t1.f1 = t2.f1;
			

After parsing this sql, data in TSelectSqlStatement.Tables is:

Tables.Count = 3;

Tables[0].TableName = 'table1';
Tables[0].TablePrefix = 'my';
Tables[0].TableAlias = 't1';

Tables[1].TableName = 'table2';
Tables[1].TablePrefix = 'my';
Tables[1].TableAlias = 't2';

Tables[2].TableName = 'table3';
Tables[2].TablePrefix = 'my';
Tables[2].TableAlias = 't3';
			

Now check the data in JoinTables:

JoinTables.Count = 1;


JoinTables.items[0].JoinTableType = jttTable; // the collection of join is table : my.table1
JoinTables.items[0].JoinTable = Tables[0];//my.table1
JoinTables.items[0].JoinItems.count = 1;

JoinTables.items[0].JoinItems[0].JoinItemTableType = jttJoin;//the collection of this joinitem is join
JoinTables.items[0].JoinItems[0].JoinItemJoin = AJoin; // ajoin point to (my.table2 t2
left join my.table3 t3
on t2.f1 = t3.f1) as joinalias1

JoinTables.items[0].JoinItems[0].JoinType = sjtjoin;
JoinTables.items[0].JoinItems[0].JoinQualType = sjqOn;
JoinTables.items[0].JoinItems[0].JoinQual = AEXPRESSION ; //a custom expressoin point to t1.f1 = t2.f1


JoinTables.items[0].JoinItems[0].JoinItemJoin.JoinTableType = jttTable;
JoinTables.items[0].JoinItems[0].JoinItemJoin.JoinTable = Tables[1]; //my.table2
JoinTables.items[0].JoinItems[0].JoinItemJoin.Alias = joinalias1
JoinTables.items[0].JoinItems[0].JoinItemJoin.AliasWithAs = true;
JoinTables.items[0].JoinItems[0].JoinItemJoin.NestedLevel = 1;
JoinTables.items[0].JoinItems[0].JoinItemJoin.JoinItems.count = 1;

JoinTables.items[0].JoinItems[0].JoinItemJoin.JoinItems[0].JoinItemTableType = jttTable;
JoinTables.items[0].JoinItems[0].JoinItemJoin.JoinItems[0].JoinItemTable = Tables[2]; //my.table3
JoinTables.items[0].JoinItems[0].JoinItemJoin.JoinItems[0].JoinType = sjtleft;
JoinTables.items[0].JoinItems[0].JoinItemJoin.JoinItems[0].JoinQualType = jqtOn;
JoinTables.items[0].JoinItems[0].JoinItemJoin.JoinItems[0].JoinQual = AEXPRESSION ; //a custom expressoin point to t2.f1 = t3.f1
			

Scenario 4

select t1.f1
from my.table1 t1
 right join ((my.table2 t2
 left outer join my.table3 t3
 on (t2.f1 = t3.f2))
 left join (my.table4 t4
 full outer join my.table5 t5
 on (t4.f1 = t5.f1)) t4alias
 on (t4.b1 = t2.c1))
 on (t1.a1 = t3.b3);
			

After parsing this sql, data in TSelectSqlStatement.Tables is:

Tables.Count = 5;

Tables[0].TableName = 'table1';
Tables[0].TablePrefix = 'my';
Tables[0].TableAlias = 't1';

Tables[1].TableName = 'table2';
Tables[1].TablePrefix = 'my';
Tables[1].TableAlias = 't2';

Tables[2].TableName = 'table3';
Tables[2].TablePrefix = 'my';
Tables[2].TableAlias = 't3';

Tables[3].TableName = 'table4';
Tables[3].TablePrefix = 'my';
Tables[3].TableAlias = 't4';

Tables[4].TableName = 'table5';
Tables[4].TablePrefix = 'my';
Tables[4].TableAlias = 't5';
			

Now, check the data in JoinTables:

JoinTables.Count = 1;

JoinTables.items[0].JoinTableType = jttTable;
JoinTables.items[0].JoinTable = Tables[0]; //my.table1

JoinTables.items[0].JoinItems.count = 1;

JoinTables.items[0].JoinItems[0].JoinType = sjtrightjoin;
JoinTables.items[0].JoinItems[0].JoinQualType = sjqOn;
JoinTables.items[0].JoinItems[0].JoinQual = AEXPRESSION ; //a custom expressoin point to t1.a1 = t3.b3

JoinTables.items[0].JoinItems[0].JoinItemType = jttJoin;
JoinTables.items[0].JoinItems[0].JoinItemJoin = AJoin; // ((my.table2 t2
left outer join my.table3 t3
on (t2.f1 = t3.f2))
left join (my.table4 t4
full outer join my.table5 t5
on (t4.f1 = t5.f1)) t4alias
on (t4.b1 = t2.c1))



AJoin.NestedLevel = 1;
AJoin.JoinTableType = jttJoin;
AJoin.JoinJoin = ASubJoin; //(my.table2 t2
left outer join my.table3 t3
on (t2.f1 = t3.f2))

ASubJoin.NestedLevel = 1;
ASubJoin.JoinTableType = jttTable;
ASubJoin.JoinTable = Tables[1]; //my.table2
ASubJoin.JoinItems.count = 1;
ASubJoin.JoinItems.items[0].JoinType = sjtleftjoin;
ASubJoin.JoinItems.items[0].JoinQualType = jtqon;
ASubJoin.JoinItems.items[0].JoinQual = AExpression;//t2.f1 = t3.f2
ASubJoin.JoinItems.items[0].JoinItemTableType = jttTable;
ASubJoin.JoinItems.items[0].JoinItemTable = Tables[2]; //my.table3


AJoin.JoinItems.count = 1;

AJoin.JoinItems.items[0].JoinTableType = jttJoin;//again, this is a join
AJoin.JoinItems.items[0].JoinJoin = ASub2Join;//(my.table4 t4
full outer join my.table5 t5
on (t4.f1 = t5.f1)) t4alias

ASub2Join.Alias = t4alias;
ASub2Join.NestedLevel = 1;
ASub2Join.JoinTableType = jttTable;
ASub2Join.JoinTable = Tables[3]; //my.table4
ASub2Join.JoinItems.count = 1;
ASub2Join.JoinItems.items[0].JoinType = sjtfullOuter;
ASub2Join.JoinItems.items[0].JoinQualType = jtqon;
ASub2Join.JoinItems.items[0].JoinQual = AExpression;//t4.f1 = t5.f1
ASub2Join.JoinItems.items[0].JoinItemTableType = jttTable;
ASubJoin.JoinItems.items[0].JoinItemTable = Tables[4]; //my.table5

AJoin.JoinItems.items[0].JoinType = sjtleftouter;//left join
AJoin.JoinItems.items[0].JoinQualType = sjqOn;
AJoin.JoinItems.items[0].JoinQual = sjqOn;// t4.b1 = t2.c1
			

 

Supported Database

 

Google BigQuery

 

Couchbase database

 

IBM DB2 database

 

EMC Greenplum

 

SAP Hana

 

hadoop hive

 

Impala

 

IBM Informix database

 

MySQL database

 

Netezza database

 

Openedge database

 

Oracle database

 

PostgreSQL database

 

Amazon redshift

 

Snowflake SQL

 

Spark SQL

 

Microsoft SQL Server database

 

Sybase database

 

Teradata database

 

Vertica database

 

Microsfot Office Access database
Download General SQL Parser