关于一条查重某字段的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
[解决办法]