I think this can be solved using LOOKUP
function. LOOKUP
function joins multiple dataset using a common field in the involved datasets.
Create a tablix and set the DataSetName
property to your second dataset.

Drag and drop the fields to the columns you want to show. For the Student Name column use the following expression:
=Lookup(Fields!Student_id.Value,Fields!Student_id.Value,Fields!StudentName.Value,"DataSet21")
In the above expression replace DataSet21
by the actual name of your
first dataset.
It will preview something like this:

UPDATE: Grouping by a header row.
Add a tablix and set your second dataset in DataSetName
property. Add Exam
and Note
fields to the corresponding columns.

Add a Parent Row Group.

In the Tablix group window select the Add group header checkbox and use the following expression:
=Lookup(Fields!Student_id.Value,
Fields!Student_id.Value,Fields!StudentName.Value,"DataSet21")

Delete the first column created by the previous grouping setting.

In the cell above Exam
use the following expression:
="Student Name: " &
Lookup(Fields!Student_id.Value,Fields!Student_id.Value,Fields!StudentName.Value,"FirstDataSet")
Now select Exam and Note row and add a row above outside the group.

Type Exam
and Note
in the corresponding cell above [Exam]
and [Note]
fields.
Select the three cells in the first row, right click it and select Merge Cells
.
It will preview something like this:

If you want to delete the first blank row, you can do it smoothly.
Let me know if this helps.