想爆头的sql查询,sql性能优化

degehuawu 2010-02-04 12:22:43
DECLARE @table TABLE
(
id INT PRIMARY KEY,
bundle NVARCHAR(20),
section NVARCHAR(20)
)
INSERT INTO @table VALUES(1,'001','A')
INSERT INTO @table VALUES(2,'001','A')
INSERT INTO @table VALUES(3,'002','A')
INSERT INTO @table VALUES(4,'002','B')
INSERT INTO @table VALUES(5,'003','B')
INSERT INTO @table VALUES(6,'003','A')
INSERT INTO @table VALUES(7,'003','C')
INSERT INTO @table VALUES(8,'004','A')
INSERT INTO @table VALUES(9,'005','D')
SELECT * FROM @table
示例表(id为主键)
id bundle section
1 001 A
2 001 A
3 002 A
4 002 B
5 003 B
6 003 A
7 003 C
8 004 A
9 005 D

问1:筛选出bundle相同,但section不同的行,
只有一个bundle的不用查出来,请注意,
该表数据量非常大,必须要考虑性能
(可以提出索引优化等建议)
筛选结果应为:
id bundle section
3 002 A
4 002 B
5 003 B
6 003 A
7 003 C
...全文
103 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
--小F-- 2010-02-04
  • 打赏
  • 举报
回复
select
*
from
@table t
where
exists(select 1 from @table where bundle=t.bundle and [section]<>t.[section])
playwarcraft 2010-02-04
  • 打赏
  • 举报
回复
select * from @table as A
where exists(select 1 from @table where bundle=A.bundle group by bundle having count(distinct section)>1)
百年树人 2010-02-04
  • 打赏
  • 举报
回复
select *
from @table t
where exists(select 1 from @table where bundle=t.bundle and [section]!=t.[section])
liangCK 2010-02-04
  • 打赏
  • 举报
回复
SELECT * FROM tb AS A
WHERE EXISTS(SELECT * FROM tb
WHERE bundle = A.bundle AND section <> A.section
AND A.id <> id)
degehuawu 2010-02-04
  • 打赏
  • 举报
回复
select distinct a.id,a.bundle,a.section
from @table a
join @table b on a.bundle= b.bundle
where a.section <> b.section and a.id<> b.id

终于找到一个2分11秒的了,呵呵!还得谢谢大家帮助呀
degehuawu 2010-02-04
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 luckyrandom 的回复:]
有偿支持
[/Quote]
有偿支持?哈哈,啥意思呀,应该还要从硬件方面下手整吧,呵呵
Q315054403 2010-02-04
  • 打赏
  • 举报
回复
有偿支持
degehuawu 2010-02-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 liangck 的回复:]
SQL codeSELECT*FROM tbAS AWHEREEXISTS(SELECT*FROM tbWHERE bundle= A.bundleAND section<> A.sectionAND A.id<> id)
[/Quote]
谢谢你的帮助,
我想请教下在一个有六千万行数据的表中,这里应该怎么提高查询速率呢?
有什么好的优化建议吗?
谢谢!
--小F-- 2010-02-04
  • 打赏
  • 举报
回复
在bundle和[section]字段加索引
degehuawu 2010-02-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 playwarcraft 的回复:]
SQL codeselect*from@tableas Awhereexists(select1from@tablewhere bundle=A.bundlegroupby bundlehavingcount(distinct section)>1)
[/Quote]
谢谢你,不过在实际表查询中会出现有重复的值,不知道为什么,而且执行时间过长,有没有什么好的优化建议呢?
谢谢
degehuawu 2010-02-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 josy 的回复:]
SQL codeselect*from@table twhereexists(select1from@tablewhere bundle=t.bundleand[section]!=t.[section])
[/Quote]
呵呵,非常感谢你的热心帮助,感觉和我原来写的差不多,就是后面两条件互换了一下
这是我写的:
select seq_no,bundle_id,prod_section
from rfid_transaction_table a
where exists(select 1 from rfid_transaction_table where [prod_section]<>a.[prod_section] and bundle_id=a.bundle_id)

但是这两句在我的实际表rfid_transaction_table中执行的时间分别是5分多钟和3分多钟,都超过2分钟的要求,我想问下有没有更好的优化建议呢?
期待你的回复,谢谢!

22,210

社区成员

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

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