io la risolverei sfruttando normali classi .net e linq:
fai conto che tabella1 e tabella2 vengano popolate con una normalissima query ado, ExecuteReader.
il risultato puoi utilizzarlo direttamente, oppure ripopolare un dataset, ma io sinceramente non uso mai dataset/datatable, lavoro sempre con oggetti parlanti di dominio, dove con linq puoi fare tutte le manipolazioni che vuoi: http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b
forse puoi fare il tutto anche partendo da dataset/datatable, ma sicuramente è più complicato e meno "pulito":
Michael Denny | Visual C# MVP
http://blogs.dotnethell.it/Regulator/
http://dennymichael.wordpress.com
http://mvp.microsoft.com/mvp/Michael%20Denny-5000735
Twitter: @dennymic