再次求助, 组合查询时筛选记录的问题

吉普赛的歌 2012-04-06 09:58:22
-- 建立初始数据
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秒。
名字相同时是没有问题的, 不明白问题出在什么地方了。
...全文
139 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 2012-04-12
  • 打赏
  • 举报
回复
再没人就结贴了
吉普赛的歌 2012-04-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

给予多方面考虑,建议lz建索引,比较好,因为你的数据量在不断增加,这个将来肯定是查询的瓶经所在,不如把问题在前面处理,这样以后就好办了。
[/Quote]
不是建不建索引, 是怎么样建索引?4个组合的条件, 16种可能, 要怎么建才好?
了解 2012-04-06
  • 打赏
  • 举报
回复
给予多方面考虑,建议lz建索引,比较好,因为你的数据量在不断增加,这个将来肯定是查询的瓶经所在,不如把问题在前面处理,这样以后就好办了。
吉普赛的歌 2012-04-06
  • 打赏
  • 举报
回复
不要小看这个语句, 本人觉得他是做了一个笛卡尔积,如果全部是同名字不同身份证,5万*5万, 你觉得很小吗?
吉普赛的歌 2012-04-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

5万多条 5分多钟,你电脑问题吧

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

按你的做了, 不过只建了一个针对IdCard的,这样只搜索同身份证时, 速度很快,


--实际是有4个checkbox, 要求 □ 姓名, □ 性别, □ 身份证号, □ 生日
--选中之后能组合查询, 这样算下来 4*4 = 16 种可能

我每一种都得建一个索引?



gaobinbinbin 2012-04-06
  • 打赏
  • 举报
回复
不知这种方法是否可以解决你的问题
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
黄_瓜 2012-04-06
  • 打赏
  • 举报
回复
5万多条 5分多钟,你电脑问题吧

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


22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧