Hi you can have trigger on Child object to check if value selected in Child picklist is present in parent object's MultiSelect Picklist or not.
Giving you example using Account as Parent and contact as child
Account has Multi_version__c field as multi Select, While
Contact has Version__C as picklist
trigger TgrPreventVersionSelection on Contact (after Insert, before update) {
// first find Accounts to get multi Select pickList values
Set<Id> AccIds = new set<Id>();
For(Contact c : Trigger.new)
{
if(c.AccountId != null)
AccIds.add(c.AccountID);
}
// Thsis map will have parent object Id( Account here) and values of multiSelectPicKlist in Set.
Map<Id, set<string>> mpAcWithMultiPickList = new map<Id, set<string>>();
List<Account> AccList = new list<Account>();
AccList = [select id, name, Multi_version__c from Account where Id = :AccIds];
// once We have Accounts, we'll populate a map having Account ID and set of string present in multi Select piclist
For(Account acc : Acclist)
{
if(acc.Multi_version__c != null)
{
list<String> slist = acc.Multi_version__c.split(';');
set<String> versionStringSet = new set<string>(slist);
mpAcWithMultiPickList.put(acc.id, versionStringSet); //converting list to set
}// end of If condition
}// for loop
// Once we've map of Account and Set, we can ran check to see value selected in child is present in parent's multiselect(set of string) or not
For(contact c : trigger.new)
{
if(c.AccountId != null)
{
Set<string> SettoCompare =mpAcWithMultiPickList.get(c.AccountId);
If(!SettoCompare.contains(c.version__c))
c.addError('Version doesn\'t Exist in Parent');
}
}
}