The simplest and most obvious route would be to query each table separately and merge in the Ids. Depending on your implementation, consuming additional queries and query rows might not be too big a deal:
Set<Id> employeeIds = new Set<Id>();
for (Employee_Skills__c skill : [/*existing skill query*/])
{
employeeIds.add(skill.Employee_Id__c);
}
for (Employee_Training__c training : [/*existing skill query*/])
{
employeeIds.add(training.Employee_Id__c);
}
List<Contact> employees = [SELECT Name, Email FROM Contact WHERE Id IN :employeeIds];
If the additional governor consumption is an issue, there are several ways you could roll data up from these child objects so joins are not necessary. For instance, you could use dlrs to create a rollup of unique skill/training names in a simple, declarative manner.