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

我对一个帖子的几分悲哀.....无语:散分
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语句的速度及质量!我仰天长叹:悲哀........


SQL code
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 ALL
SELECT 'B04', 'D09', 'N00', 'M30' UNION ALL
SELECT 'B01', 'C88', 'B01', 'T10' UNION ALL
SELECT 'D05', 'T11', 'N00', 'B05' UNION ALL
SELECT 'M33', 'D09', 'N00', 'M33' UNION ALL
SELECT 'D09', 'D09', 'D09', 'M30' UNION ALL
SELECT 'B04', 'B04', 'B04', 'B04' UNION ALL
SELECT 'T55', 'T20', 'Z43', 'Z15' UNION ALL
SELECT 'Z78', 'Z34', 'D10', 'D10' UNION ALL
SELECT '', '', '', '' UNION ALL
SELECT NULL, NULL, NULL, NULL;


---方法一:(最优方法)
SELECT * FROM test
WHERE (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 test
WHERE (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 )  --四个均相等的情况


------解决方案--------------------
沙发F!
------解决方案--------------------
学习.
------解决方案--------------------
还好我没有回那个帖.
------解决方案--------------------
探讨
学习.

------解决方案--------------------
探讨
还好我没有回那个帖.

------解决方案--------------------
学习
------解决方案--------------------
探讨
引用:
还好我没有回那个帖.



我也没

------解决方案--------------------
楼主结贴率为0.

没有权利说任何一个人。

哪怕他给的回复是答非所问。

回帖是兴趣,不是义务。


------解决方案--------------------
看了看,我也没没回此贴!
------解决方案--------------------
SQL版——鲁迅! 精神还是值得称道...
------解决方案--------------------
jf ,接分啊。
------解决方案--------------------
那个帖子是MySQL/Postgresql版的,感觉很暴力。。。。。。
楼主还有个马甲?
------解决方案--------------------