Удалить дублирующуюся запись столбца из запроса SQL Server

#sql #sql-server

#sql #sql-сервер

Вопрос:

Я хотел бы удалить все дубликаты из запроса, чтобы возвращать отдельные строки записей…

 SELECT 
    DISTINCT (rme.RoleMappingEmployeeKey) AS role_key_one,
    me.EmpSAPID AS emp_sap_id,
    me.SrKey AS emp_sr_key,
    CONCAT(me.EmpFirstName,' ',me.EmpLastName) AS emp_name,
    rm.RoleName AS emp_role_name,
    rm.SubmittedDate AS emp_role_given_date,
    ms.SiteName AS site_name,
    hd.HRDeptName AS dept_name,
    hsd.HRSDName AS sub_dept_name,
    mc2.ClientName AS client_name,
    mb.BusinessTypeName AS bus_type,
    mc3.CompName AS comp_name,
    hem.SeparationDate AS lwd
FROM 
    dbo.RoleMappingEmployee rme
LEFT JOIN 
    dbo.MasterEmp me ON me.SrKey = rme.SrKey
LEFT JOIN 
    dbo.MasterCountry mc ON (mc.CountryKey = rme.CountryKey OR mc.CountryKey = me.CountryKey)
LEFT JOIN 
    dbo.RoleMaster rm ON rm.RoleKey = rme.RoleKey
LEFT JOIN 
    dbo.HRMasterEmployeeMain hem ON (hem.SrKey = me.SrKey AND hem.EmployeeStatus=10)
LEFT JOIN 
    dbo.HRMapping_SubDept_SBand_Desig_SubFunction hsdsdsf ON hsdsdsf.HRSubDeptBDSbKey = hem.HRSubDeptBDSbKey
LEFT JOIN 
    dbo.HRMasterSubDepartment hsd ON (hsd.HRSDKey = rme.SubDeptKey OR hsd.HRSDKey = hsdsdsf.HRSDKey)
LEFT JOIN 
    dbo.HRMasterDepartment hd ON ( hd.HRDeptKey = rme.DeptKey OR hd.HRDeptKey = hsd.HRDeptKey)
LEFT JOIN 
    dbo.MasterSite ms ON (ms.SiteKey = rme.SiteKey OR ms.SiteKey = me.SiteKey)
LEFT JOIN 
    dbo.MasterClient mc2 ON (mc2.ClientKey = rme.ClientKey OR mc2.ClientKey = hd.ClientKey)
LEFT JOIN 
    dbo.MasterBusiness mb ON (mb.BusinessTypeKey = rme.BusinessTypeKey OR mb.BusinessTypeKey = hd.BusinessTypeKey)
LEFT JOIN 
    dbo.MasterComp mc3 ON (mc3.CompKey = rme.CompKey OR mc3.CountryKey = mc.CountryKey)
WHERE
    me.IsActive = 0
ORDER BY
    rme.RoleMappingEmployeeKey DESC
  

Этот запрос возвращает результат, как показано на этом снимке экрана:

Проверьте значение, выделенное ниже

RoleMappingEmployeeKey КАК role_key_one, повторяется, хотя я упомянул ключевое DISTINCT слово для столбца в запросе…

Комментарии:

1. DISTINCT работает со всеми значениями в строке, а не только с первым. Вы искали, как удалить дубликаты? Такого рода вопросы задавались много, много, много раз раньше.

2. Это первое левое соединение выполняется как обычное внутреннее соединение. Переместите условие предложения where в предложение on, чтобы получить истинное поведение соединения слева.

3. я видел использование MIN функции в качестве альтернативы, но тоже не работал

4. когда я добавил предложение where к первому левому соединению, я получаю в 20 раз больше строк, чем сейчас…

5. Я согласен с HoneyBadger. Попробуйте distinct, добавив / удалив требуемые столбцы, и сравните результат.

Ответ №1:

Отказ от ответственности

если DISTINCT «не работает», это означает, что существует разница между «повторяющимися» столбцами. Итак, с «удалением дубликатов» вы что-то потеряете — разницу, о которой я упоминал выше. Но … если вас не волнует эта разница, вы могли бы использовать что-то вроде этого:

 WITH dedup as
(
    SELECT 
        (rme.RoleMappingEmployeeKey) AS role_key_one,
        row_number() over (partition by rme.RoleMappingEmployeeKey order by rm.SubmittedDate) [role_key_one_rank],
        me.EmpSAPID AS emp_sap_id,
        me.SrKey AS emp_sr_key,
        CONCAT(me.EmpFirstName,' ',me.EmpLastName) AS emp_name,
        rm.RoleName AS emp_role_name,
        rm.SubmittedDate AS emp_role_given_date,
        ms.SiteName AS site_name,
        hd.HRDeptName AS dept_name,
        hsd.HRSDName AS sub_dept_name,
        mc2.ClientName AS client_name,
        mb.BusinessTypeName AS bus_type,
        mc3.CompName AS comp_name,
        hem.SeparationDate AS lwd
    FROM 
        dbo.RoleMappingEmployee rme
    LEFT JOIN 
        dbo.MasterEmp me ON me.SrKey = rme.SrKey
    LEFT JOIN 
        dbo.MasterCountry mc ON (mc.CountryKey = rme.CountryKey OR mc.CountryKey = me.CountryKey)
    LEFT JOIN 
        dbo.RoleMaster rm ON rm.RoleKey = rme.RoleKey
    LEFT JOIN 
        dbo.HRMasterEmployeeMain hem ON (hem.SrKey = me.SrKey AND hem.EmployeeStatus=10)
    LEFT JOIN 
        dbo.HRMapping_SubDept_SBand_Desig_SubFunction hsdsdsf ON hsdsdsf.HRSubDeptBDSbKey = hem.HRSubDeptBDSbKey
    LEFT JOIN 
        dbo.HRMasterSubDepartment hsd ON (hsd.HRSDKey = rme.SubDeptKey OR hsd.HRSDKey = hsdsdsf.HRSDKey)
    LEFT JOIN 
        dbo.HRMasterDepartment hd ON ( hd.HRDeptKey = rme.DeptKey OR hd.HRDeptKey = hsd.HRDeptKey)
    LEFT JOIN 
        dbo.MasterSite ms ON (ms.SiteKey = rme.SiteKey OR ms.SiteKey = me.SiteKey)
    LEFT JOIN 
        dbo.MasterClient mc2 ON (mc2.ClientKey = rme.ClientKey OR mc2.ClientKey = hd.ClientKey)
    LEFT JOIN 
        dbo.MasterBusiness mb ON (mb.BusinessTypeKey = rme.BusinessTypeKey OR mb.BusinessTypeKey = hd.BusinessTypeKey)
    LEFT JOIN 
        dbo.MasterComp mc3 ON (mc3.CompKey = rme.CompKey OR mc3.CountryKey = mc.CountryKey)
    WHERE
        me.IsActive = 0
)
select distinct *
from dedup
where [role_key_one_rank] = 1
ORDER BY role_key_one DESC
  

Комментарии:

1. бинго, которое сработало … удалило дубликаты …. то же, что и количество в моем интерфейсном массиве после вызова removeDuplicates функции…. теперь я получил with предложение Google…. есть небольшая хитрость…. Редактировать: скажем, современный подзапрос