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

再次求助, 组合查询时筛选记录的问题
SQL code
-- 建立初始数据
CREATE TABLE Person
(
    PersonId INT IDENTITY(1,1) PRIMARY KEY,
    PersonName NVARCHAR(50),
    IdCard NVARCHAR(50),
    PersonGender NCHAR(2),
    Birthday DATETIME DEFAULT GETDATE()
)

INSERT INTO Person (PersonName,IdCard,PersonGender,Birthday) VALUES('a','123456789012345678',1,'1970-1-2')
INSERT INTO Person (PersonName,IdCard,PersonGender,Birthday) VALUES('a','123456789012345677',1,'1970-1-3')
INSERT INTO Person (PersonName,IdCard,PersonGender,Birthday) VALUES('a','123456789012345678',1,'1970-1-2')
INSERT INTO Person (PersonName,IdCard,PersonGender,Birthday) VALUES('b','123456789012345678',1,'1970-1-2')
INSERT INTO Person (PersonName,IdCard,PersonGender,Birthday) VALUES('b','123456789012345677',2,'1970-1-3') 
INSERT INTO Person (PersonName,IdCard,PersonGender,Birthday) VALUES('c','123456789012345676',1,'1970-1-3')


这是数据, 当然, 我就不多写了, 测试数据至少是5万条.

原来的贴子中:
http://topic.csdn.net/u/20120330/14/b61bc1ee-647b-4bf8-b316-54a9aa06c475.html
SQL777 老兄的代码很精悍, 
select * from person a where exists(select 1 from person where personname=a.personname and idcard=a.idcard and PersonId <>a.PersonId ) 

于是用了他的, 但是数据量大时, 有问题。 
主要是——当身份证相等时, 几乎无法正常执行。5万多条的数据, 居然跑了5分23秒。
名字相同时是没有问题的, 不明白问题出在什么地方了。

------解决方案--------------------
5万多条 5分多钟,你电脑问题吧

可以考虑
建个索引试试
SQL code
create index xx_oo on person(personname,idcard,PersonId)

------解决方案--------------------
不知这种方法是否可以解决你的问题
SQL code
select distinct p1.Personid,p1.PersonName,p1.idCard from Person as P1 , Person as p2
where  p1.PersonName=p2.PersonName and p1.IdCard<>p2.idCard

------解决方案--------------------
给予多方面考虑,建议lz建索引,比较好,因为你的数据量在不断增加,这个将来肯定是查询的瓶经所在,不如把问题在前面处理,这样以后就好办了。