Multiple joins for fields that need the same data. SQL Server 2008 R2
Classic de-normalized data. I've seen this often in healthcare. You can create a function to do this for you. It's unlikely to be faster but will save your some typing. You'd have to test each to see which is quicker. But the bottom line is there isn't a "great" improvement method.

create function dbo.get_icd_code (@icd varchar(16))
returns varchar(256)
as 
begin
    declare @return varchar(256)
    select @return = DESCRIPTION
    from ICD_DESCRIPTIONS
    where ICD_CODE = @icd
    return @return
end


Then call it...

SELECT  
    ICD_CODE1,
    dbo.get_icd_code(ICD_CODE1) 
    ICD_CODE2,
    dbo.get_icd_code(ICD_CODE2) 
    ICD_CODE3,
    dbo.get_icd_code(ICD_CODE3) 
FROM ICD_CODES


Another way to speed it up is to stage your data first since there are so many ICD10 codes, but you'll need to provide the entire query for me to determine if this will work--primarily what other tables you are joining to and limiting from.

Lastly, you could try to un-pivot your data, join to the description field once, and then either keep it in this vertical fashion or pivot it back up. Again, hard to benchmark this against the multiple joins without being in your environment.