【问题标题】:TSQL not returning DISTINCT ValuesTSQL 不返回 DISTINCT 值
【发布时间】:2015-05-22 15:37:50
【问题描述】:

我正在尝试使用 DISTINCT 仅获取唯一的主键值,但无法弄清楚 DISTINCT 不起作用的原因。下面的 TSQL(使用 Windows Azure SQL Server)试图通过查看地址字段中的第一个数值字符串来识别重复的地址。它正在正确返回匹配项,但重复值太多。

SELECT DISTINCT a.Id AS DinstinctID
    ,b.Id AS LeftID
    ,LEFT(b.StreetAddress, CHARINDEX(' ', b.StreetAddress))
    ,LEFT(a.StreetAddress, CHARINDEX(' ', a.StreetAddress))
FROM [User] a
JOIN [User] b ON b.Id != a.Id AND 
    LEFT(a.StreetAddress,CHARINDEX(' ', a.StreetAddress))  = 
       LEFT(b.StreetAddress,CHARINDEX(' ', b.StreetAddress)) 
    AND b.DateSubmitted >= DATEADD(day, -5, CONVERT(DATE, GETDATE())) 

【问题讨论】:

  • 仔细查看前导或尾随空格或不可打印的字符。您可以尝试将字符串与“!”之类的内容连接起来。前后看空间。
  • 现在正在清理它,仍然习惯 SO 格式抱歉。
  • 真的确定你想要一个笛卡尔积,但不包括(仅)主对角线?
  • 感谢 Krishnraj!看起来好多了……
  • 我不确定你在问 Pieter 什么?

标签: sql-server tsql distinct


【解决方案1】:

你不是很清楚
Distinct 基于所有列
Distinct 给出了正确的答案
由于您有 b.Id != a.Id 所有返回的行都是不同的
我想这就是你要找的
没有理由在两列中返回相同的地址

SELECT distinct a.Id AS DinstinctID
      ,LEFT(b.StreetAddress, CHARINDEX(' ', b.StreetAddress))
FROM [User] a
JOIN [User] b ON b.Id > a.Id 
     AND  LEFT(a.StreetAddress,CHARINDEX(' ', a.StreetAddress))  = 
          LEFT(b.StreetAddress,CHARINDEX(' ', b.StreetAddress)) 
     AND b.DateSubmitted >= DATEADD(day, -5, CONVERT(DATE, GETDATE())) 
order by 2

【讨论】:

  • 成功了@Blam!再次抱歉,我从这个问题中学到了很多,并且会在未来的问题中做得更好。我需要更多地研究 DISTINCT。你这个大男人!也感谢其他人...
【解决方案2】:

您可以尝试将字符串转换为二进制并以这种方式进行比较。将帮助您发现是否有任何隐藏字符导致连接条件无法按预期运行。

【讨论】:

  • 我可能没有解释清楚,但我想成为 DISTINCT 的字段是数据库自动生成的主键 IDENTITY (SMALLINT) 字段。
  • 我想我明白你在说什么@CoderKen。我会检查一下。
  • 不是你没有解释的很好。只是一个.ID 唯一的?
  • 正是@Blam。对困惑感到抱歉。 a.ID 是我希望得到的 DISTINCT 值而不是地址。
猜你喜欢
  • 2012-06-03
  • 2019-01-31
  • 1970-01-01
  • 2018-06-09
  • 1970-01-01
  • 2012-10-07
  • 1970-01-01
  • 1970-01-01
  • 2015-12-28
相关资源
最近更新 更多