The way I usually do this is to create a linked server object on the SQL server database, and then in the query you can do something like this
select a.column, b.column2
[server1].[db].[schema].[table] a join [server2].[db].[schema].[table2] b on
a.common = b.common
Or you can make use of the Openquery() or Openrowset() functions.
It's a shame that reporting services doesn't have good objects to do joins and won't let you use multiple datasets in the same tablix, but then again the linked server option already exists and it's always going to be faster to do any joins with the database engine rather than bringing all the data into reporting services and doing it that. That tends to be a general rule with reporting services - do as much as you can in SQL or MDX and just use expressions for formatting or presentation tasks.
A second option that I occasionally use is to refer to cells in other tablixes directly.
For example if you have 2 tablixes that each connect to different data sets (from different databases), in tablix 2 you can refer to cells from tablix 1.
i.e. if you have a cell in tablix 1 that you have named "textbox1" then in tablix 2 you could use this expression: