面试时候SQL查询优化问题,为此身价跌了不少

v192 2005-03-21 07:34:44
表table1、table2都有字段[姓名](varchar(10) ),求table1中和table2中字段[姓名]不重复的记录,请写出你觉得最优的SQL语句。

SELECT * FROM table1 WHERE NOT EXIST
(SELECT * FROM table1, Table2 WHERE table1.[姓名] = table2.[姓名] )

我是这么写的,被枪毙了,我想不出来更优的算法了,各位帮忙啊
...全文
302 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
paoluo 2005-03-22
  • 打赏
  • 举报
回复
楼上的,你写的语句和楼主实现的效果基本相同啦。

但是想问一下,到底那种写法运行更快些?
jxwangjm 2005-03-22
  • 打赏
  • 举报
回复
To:楼主

不好意思:出丑了
jxwangjm 2005-03-22
  • 打赏
  • 举报
回复
To:楼主
这个子句语法有错误,谈不上优化,所以你被枪毙也就不足为奇。
SELECT * FROM table1, Table2 WHERE table1.[姓名] = table2.[姓名]
应该是Select Table1.* from Table1 inner join Table2 where table1.[姓名]=table2.[姓名]
ggyz 2005-03-21
  • 打赏
  • 举报
回复
这样写:
SELECT * FROM table1 WHERE table1.[姓名] NOT IN
(SELECT table2.[姓名] FROM table2)
这是不相关子查询,代价N+M

不知道我对题目的理解对不对?
ggyz 2005-03-21
  • 打赏
  • 举报
回复
首先楼主的写法:
SELECT * FROM table1 WHERE NOT EXIST
(SELECT * FROM table1, Table2 WHERE table1.[姓名] = table2.[姓名] )
里面多了个table1吧?
应该是:
SELECT * FROM table1 WHERE NOT EXIST
(SELECT * FROM table2 WHERE table1.[姓名] = table2.[姓名] )
这是个相关子查询,设table1中记录数为N,table2中记录数为M,查询代价为N*M
v192 2005-03-21
  • 打赏
  • 举报
回复
不好意思,是我没有表述清楚,他的table1里面包含了所有table2的[姓名]可能,并且都是不会重复的
DJadeChow 2005-03-21
  • 打赏
  • 举报
回复
SELECT * FROM table a full join table1 b using ([姓名]) where a.[姓名] <>b.[姓名]
刚才那个写错了

xiaos139 2005-03-21
  • 打赏
  • 举报
回复
Select * from table1
where [name] in
(Select [name] from table2
Union all
Select [name] from table1
Group by [name]
Having Count(name) = 1 )

沒有用NOT,應該運行起來會快點.
DJadeChow 2005-03-21
  • 打赏
  • 举报
回复
SELECT * FROM table a full join table1 b using ([姓名]) where table1.[姓名] <>table2.[姓名]
skyinfo 2005-03-21
  • 打赏
  • 举报
回复
SELECT * FROM table1 a WHERE NOT EXIST
(SELECT * FROM Table2 WHERE table1.[姓名] = a.[姓名] )
zjcxc 元老 2005-03-21
  • 打赏
  • 举报
回复
楼主写的意思是仅在表1中姓名存储的记录,似乎与题意不符,而且也可以直接简化为:

select * from table1 a
where not exists(select * from table2 where 姓名=a.姓名)

--或者(如果姓名值不唯一,可能会导致查询结果有重复记录):
select a.* from table1 a left join table2 b on a.姓名=b.姓名 where b.姓名 is null
zjcxc 元老 2005-03-21
  • 打赏
  • 举报
回复
"求table1中和table2中字段[姓名]不重复的记录"

理解上怎么这么拗口?

按字面理解,似乎是要查询出两个表中的记录,而且这两个表只查询出各自姓名字段不重复的记录

不知道是否这个意思?
xluzhong 2005-03-21
  • 打赏
  • 举报
回复
select *
from table1
union
select *
from table2
xluzhong 2005-03-21
  • 打赏
  • 举报
回复
select *
from table1 a
inner join table2 b
on a.[姓名]<>b.[姓名]

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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