AS 
SELECT q.ProgramName
     FROM
     (
         SELECT 
                CASE
                    WHEN dv.Value IS NULL THEN de.Name
                    ELSE dv.Value
                END AS ProgramName
         FROM DDCLElement de
              LEFT JOIN DDCLProperty p ON p.ElementId = de.Id AND UPPER(p.Name) IN ('PROGRAM-ID')
              LEFT JOIN DDCLValue dv ON dv.PropertyId = p.Id
                                         AND dv.ValueTypeId = 1
                                         AND dv.Value IS NOT NULL
                                         AND dv.Value != ''
         WHERE de.DdsTypeId IN (27, 28)
        
	    UNION

         SELECT 
                dv.Value AS ProgramName
         FROM DDCLElement de
              LEFT JOIN DDCLProperty p ON p.ElementId = de.Id  AND UPPER(p.Name) IN ('COMPONENT-ID')
              INNER JOIN DDCLValue dv ON dv.PropertyId = p.Id
                                          AND dv.ValueTypeId = 1
                                          AND dv.Value IS NOT NULL
         WHERE de.DdsTypeId IN (11)
        
	    UNION

         SELECT 
                dv.ReferenceName AS ProgramName
         FROM DDCLElement de
              LEFT JOIN DDCLProperty p ON p.ElementId = de.Id AND UPPER(p.Name) IN ('TASK')
              INNER JOIN DDCLValue dv ON dv.PropertyId = p.Id
                                          AND dv.ValueTypeId IN (2, 4)
         WHERE de.DdsTypeId IN (26)
     ) AS q
WHERE q.ProgramName IS NOT NULL
