日期:2014-05-18  浏览次数:20448 次

关于一条查重某字段的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 A
WHERE 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 A
WHERE EXISTS (
SELECT 1 FROM CTE WHERE Tel = A.Tel AND RowID <> A.RowID and Tel <> N'') order by Tel

------解决方案--------------------
SQL code

SELECT * FROM CTE A
WHERE 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
……