求一条高效的SQL语句!!!!!(30分)

  • 主题发起人 主题发起人 bryantd
  • 开始时间 开始时间
B

bryantd

Unregistered / Unconfirmed
GUEST, unregistred user!
假设有一个表对应有两个字段Phones (PhoneNumber , FileName),表示number在哪个file中:
PhoneNumber FileName
111 file1
222 file1

222 file2

333 file3

111 file4
111 file4
222 file4
555 file4
555 file4
666 file4

我希望写一条SQL语句,实现对file4的两个功能:
1: 如果file4文件中有重复的number,只保留一条;
2: 如果file4文件中的number和file1 file2 file3 文件中的number重复,则将他们从file4中删除。

所以上面的示例中预想得到的结果是:
PhoneNumber fileName
555 file4
666 file4

我自己的实现方法是这样的:
select Distinct PhonesA.PhoneNumber from Phones as PhonesA where PhonesA.FileName = 'file4' and PhonesA.PhoneNumber not in (select PhonesB.PhoneNumber from Phones as PhonesB where PhonesB.FileName <> 'file4');

这个方法实现起来没有问题,但是一到数据量比较大的时候,电脑就出现了无相应的状况,所以希望求一条效率比较高的SQl语句(我用的是Access数据库!)
 
你的SQL and 后面的不要就可以了。。
select Distinct PhonesA.PhoneNumber from Phones as PhonesA where PhonesA.FileName = 'file4' 就可以得到你要的结果了
 
这样做不行吧?这样只能把file4对应的number排除重复的。
 
select Distinct PhoneNumber,FileName from Phones where FileName = 'file4' and PhoneNumber not in (select PhoneNumber from Phones where FileName <> 'file4' )
 
楼上的大哥,你写的不是和我的一样吗?
 
select PhoneNumber,FileName='file4' from Phones
group by PhoneNumber
having count(PhoneNumber)=1
不对.
 
lz的思路我认为正确而且最省力了,
不知道你的PhoneNumber重复多不多?
如果PhoneNumber重复比较多,那么在not in条件后面加上个group by应该快很多。

select Distinct PhonesA.PhoneNumber from Phones as PhonesA where PhonesA.FileName = 'file4' and PhonesA.PhoneNumber not in (select PhonesB.PhoneNumber from Phones as PhonesB where PhonesB.FileName <> 'file4' group by PhoneNumber)
 
select Distinct PhonesA.PhoneNumber from Phones as PhonesA where PhonesA.FileName = 'file4' and PhonesA.PhoneNumber not in (select Distinct PhonesB.PhoneNumber from Phones as PhonesB where PhonesB.FileName <> 'file4');
 
后退
顶部