我对一个帖子的几分悲哀.....无语:散分
http://topic.csdn.net/u/20090917/16/7F6141C5-B0C4-482E-B100-0BCEAB9C2714.html
--我对这个帖子的几分担忧......
--原帖出处:
http://topic.csdn.net/u/20090917/16/7F6141C5-B0C4-482E-B100-0BCEAB9C2714.html
--急切询问如何写1个比较复杂的sql
--用户可以选择2或者3 或者4个字段
--现在简化问题, 仅仅选择4个字段 (确定),
--现在有可能记录行里很多的记录这4个字段都为空值(或者部分记录仅仅有1个为空值)。
--现在要找出这个表里4个字段重复的值 (有可能重复1个字段的值 重复2个字段的值 重复3或4个字段的值)
--这个语句该如何写
--首先这个语句要排除4个字段都为空值的记录
--之后再查或者可能重复1个字段的值 重复2个字段的值 重复3或4个字段的值。
---------------------------------------------
--( 其实,首先在做这个题目之前,我们都应该思考一下:
-- 两两相等的情况就已经包括了 每三个相等的情况 和 四个均相等的情况,各位:对吧? )
---也就是说:后两者是前者的子集!
--我发现:好多所谓的SQL高手们,为了拿分,不顾及SQL语句的速度及质量!我仰天长叹:悲哀........
DROP TABLE test;CREATE TABLE test( Id INT IDENTITY(1,1), Col1 VARCHAR(10), Col2 VARCHAR(10), Col3 VARCHAR(10), Col4 VARCHAR(10) );INSERT INTO test(Col1, Col2, Col3, Col4)SELECT 'A01', 'B03', 'C05', 'A01' UNION ALLSELECT 'B04', 'D09', 'N00', 'M30' UNION ALLSELECT 'B01', 'C88', 'B01', 'T10' UNION ALLSELECT 'D05', 'T11', 'N00', 'B05' UNION ALLSELECT 'M33', 'D09', 'N00', 'M33' UNION ALLSELECT 'D09', 'D09', 'D09', 'M30' UNION ALLSELECT 'B04', 'B04', 'B04', 'B04' UNION ALLSELECT 'T55', 'T20', 'Z43', 'Z15' UNION ALLSELECT 'Z78', 'Z34', 'D10', 'D10' UNION ALLSELECT '', '', '', '' UNION ALLSELECT NULL, NULL, NULL, NULL;---方法一:(最优方法)SELECT * FROM testWHERE (Col1<>'' OR Col2<>'' OR Col3<>'' OR Col4<>'') --排除四个字段均为空字符情况 AND (Col1=Col2 OR Col1=Col3 OR Col1=Col4 OR Col2=Col3 OR Col2=Col4 OR Col3=Col4 )--方法二:(最差的方法,弱智商方法)SELECT * FROM testWHERE (Col1<>'' OR Col2<>'' OR Col3<>'' OR Col4<>'') --排除四个字段均为空字符情况 AND ( ( Col1=Col2 OR Col1=Col3 OR Col1=Col4 OR Col2=Col3 OR Col2=Col4 OR Col3=Col4 ) --两两相等的情况 OR ( Col1=Col2 AND Col1=Col3 ) --每三个相等的情况 OR ( Col1=Col2 AND Col1=Col4 ) OR ( Col1=Col3 AND Col1=Col4 ) OR ( Col2=Col3 AND Col2=Col4 ) OR ( Col1=Col2 AND Col2=Col3 AND Col3=Col4 ) --四个均相等的情况