DISTINCT错误地返回相同的ID两次

问题描述 投票:1回答:2

这是我的SQL查询:

SELECT DISTINCT(ItemId), TCode, PartNumber,ModelNumber, ItemUOM 
FROM #Results  

此查询返回:

ItemId   TCode   Source  PartNumber   ModelNumber   ItemUOM
-----------------------------------------------------------------
1024     1000    NULL    NULL         EA
1024     1000    FLEX    FLEX         EA

#Result是我在该查询中使用左连接的临时表

为什么SELECT DISTINCT两次返回相同的ItemID 1024

SELECT DISTCINT(I.ItemId),
    (DENSE_RANK() OVER(ORDER BY I.ItemId ASC)) AS RowNumber,
    (I.TCode), E.Name AS Source, 
    I.GoldenRecordNumber AS GoldenRecordNo, I.ItemCode AS MMRefNo, 
    I.ShortDescription AS ShortText, I.LongDescription AS POText, 
    Suppliers.Description AS Manufacturer, Suppliers.Name AS  ManufacturerCode, 
    Suppliers.Abbreviation AS ManufacturerAbbr, 
    ItemSuppliers.ReferenceNo AS PartNumber, ItemSuppliers.ReferenceNo AS ModelNumber, 
    UOM.Name AS ItemUOM, MG.Name AS PSGC, 
    NM.Noun AS ClassName, NM.LongAbbrevation AS ClassDescription  
INTO 
    #Results  
FROM
    Items I  
LEFT JOIN 
    ItemSuppliers ON I.ItemId = ItemSuppliers.ItemsId 
LEFT JOIN 
    Suppliers ON ItemSuppliers.ManufacturerId = Suppliers.SupplierId 
LEFT JOIN
    UnitOfMeasurement UOM ON UOM.UOMId = I.UOMId 
LEFT JOIN
    MaterialGroup MG ON MG.MaterialGroupId = I.MaterialGroupId 
LEFT JOIN 
    NounModifiers NM ON NM.NounModifierId = I.NounModifierId 
LEFT JOIN
    AutoClass AC ON AC.ClassName = NM.Noun 
LEFT JOIN
    ERP E ON E.ERPId = I.ERPName 
LEFT JOIN 
    NounModifierAttributes NMA ON NMA.NounModifierId = 
NM.NounModifierId 
LEFT JOIN
    Attributes A ON A.AttributeId = NMA.AttributeId 
LEFT JOIN
    ItemAttributes IA ON IA.ItemId = I.ItemId  
WHERE
    (I.ItemCode LIKE '%'+'2001010088'+'%' )  

SELECT 'Int' = COUNT(distinct(ItemId))  
FROM #Results
WHERE (TCode IS NOT NULL OR MMRefNo IS NOT NULL) 

SELECT DISTINCT(ItemId), 
    TCode, Source, GoldenRecordNo, MMRefNo, ShortText, POText,
    Manufacturer, ManufacturerCode, ManufacturerAbbr, PartNumber, ModelNumber, 
    ItemUOM, PSGC, ClassName, ClassDescription 
FROM 
    #Results  
WHERE 
    (TCode IS NOT NULL OR MMRefNo IS NOT NULL) 
    AND RowNumber BETWEEN (1-1)*100 + 1 AND (((1-1) * 100 + 1) + 100) - 1   

DROP TABLE #Results 
sql distinct
2个回答
0
投票

如果您确信所选择的行可以组合在一起,那么它应该可以正常工作。 1.但如果行具有不同的数据,那么distinct将无济于事。 2.使用ltrim,rtrim删除前导和尾随空格。

例如:distinct(ltrim(rtrim(ItemId)))

如果由于空格或垃圾值,这将有所帮助


0
投票

DISTINCT的行为按预期工作。例如,您可以使用GROUP BY子句按ItemId,TCode对它们进行分组,以获得最多的记录

SELECT 
       ItemId, TCode, 
       MAX(PartNumber) PartNumber, MAX(ModelNumber) ModelNumber, 
       MAX(ItemUOM), ...
FROM #Results  
GROUP BY ItemId, TCode

如果GROUP BY子句中的任何失败,请使用ranking函数来分配排名并根据排名值获取记录。

© www.soinside.com 2019 - 2024. All rights reserved.