首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

关于一条查重某字段的sql语句,发现没重复的也被查出来了。解决办法

2012-04-28 
关于一条查重某字段的sql语句,发现没重复的也被查出来了。。。SQL codeWITH CTE AS (select RowID ROW_NUMB

关于一条查重某字段的sql语句,发现没重复的也被查出来了。。。

SQL code
WITH CTE AS (select RowID = ROW_NUMBER() OVER (ORDER BY (case when Time is null then TimeC else Time end) ASC,NEWID()),* from(            select * from               (                      select * from (select * from Orders) a                                full join (select * from PatientCome) b                                on a.GUID = b.ComeGUID               ) c               where (c.ProjectID=16 or RealProjectID=16)                  and                  (                   (convert(varchar(10),Time,120) >= '2010-01-01' and convert(varchar(10),Time,120) <='2015-02-02')                    or (convert(varchar(10),TimeC,120) >= '2010-01-01' and convert(varchar(10),TimeC,120) <='2015-02-02')                  )              ) d)SELECT * FROM CTE AWHERE EXISTS (SELECT 1 FROM CTE WHERE Tel = A.Tel AND RowID <> A.RowID) order by Tel


首先解释一下这段代码的意思,“表d”内部就不解释了,可以就理解成一张实表。
后面三行主要的意思就是根据RowID的不同来取出Tel字段重复的字段,最后用Tel字段进行排序。

通过这条sql语句实际测试结果表示,tel字段为空字符串的情况也算为重复了,而我希望Tel字段如果为空字符串的话,则不算重复
注意:这里的空字符串不是NULL,而是向数据库中插入了一个空字符串。

还有一个问题,就是该sql语句查询出的结果有部分不正确,按道理Tel字段自少有两个相同的结果才对,可是取出的Tel值有些是只有一个的(也就是说其它行没有和他相同的Tel值)。到底是什么 原因导致的呢?哪块写的不够严谨?

希望高手指点!!感激不尽!

[解决办法]
lz的意思是把cte中Tel相同的记录查询出来,Tel=''的不算重复的记录?
SQL code
SELECT * FROM CTE AWHERE EXISTS (SELECT 1 FROM CTE WHERE Tel = A.Tel AND RowID <> A.RowID and Tel <> N'') order by Tel
[解决办法]
SQL code
SELECT * FROM CTE AWHERE A.Tel <>'' and EXISTS (SELECT 1 FROM CTE WHERE Tel = A.Tel AND RowID <> A.RowID) order by Tel
[解决办法]
看到2个大问题:

乱用子SQL语句
乱用CTE



[解决办法]
探讨

感谢楼上,第一个问题已经解决了(也就是tel字段为空的字段不算差重范围)。
现在要解决第二个问题,也是非常头痛的问题。

为了便于大家更容易的分析我的问题,我先用一个demo来模拟一下我想要的结果

比如表d的数据如下
HTML code

tel other
111 11
222 22
111 33
333 44
……

热点排行