当转换in 与exists语句时碰上group by

有如下语句,想把他转换成exists语句:外表内表用的都是同一张表

select * from shuxue_new as a where id in  (select max(id) from shuxue_new group by userid);

select * from shuxue_new as a where id not in  (select max(id) from shuxue_new group by userid);

于是:

select * from shuxue_new as a where exists  (select max(id),userid,count(*) from shuxue_new as b where a.id=b.id  group by userid);

select * from shuxue_new as a where not exists  (select max(id),userid,count(*) from shuxue_new as b where a.id=b.id  group by userid);

结果很悲剧,不管怎么调整exists子句,结果依旧不是正确的!原因是因为上面exists子句中有group by!

而在一条SQL语句执行过程中,where条件是在group by与选取select行前面执行的,所以上面的exists子句在还没分组前已经执行了a.id=b.id,因为是同一张表,所以a.id=b.id肯定是返回true的!

另外像select max(id),userid,count(*) from shuxue_new as b where a.id=b.id( 或者等于一个常量) group by userid) 这种语句本身就有问题!因为where条件里指定了常量等条件,你再group by ,再select max(id) 已经是没有意义的了!最后查询出的永远都只是符合where条件的那几列!

所以像这种使用了group by,或者select max()等函数的in 语句是不能方便的转换成existsy语句的!!

delete a from shuxue_new as a left join (select max(id) as id from shuxue_new  group by userid) as b on a.id=b.id where b.id is null;

时间: 2024-10-04 05:41:29

当转换in 与exists语句时碰上group by的相关文章

EXISTS语句

通常在我写EXISTS语句时,我会写成IF EXISTS(SELECT TOP(1) 1 FROM XXX),也没细细考究过为什么要这么写,只是隐约认为这样写没有啥问题,那今天就深究下吧! 首先准备测试测试数据 USE [TestDB1] GO CREATE TABLE TB1001 ( ID INT IDENTITY(1,1), C1 VARCHAR(200), CONSTRAINT PK_TB1001_ID PRIMARY KEY(ID) ) GO CREATE INDEX IDX_ID O

【转】通过xml处理sql语句时对小于号与大于号的处理转换

当我们需要通过xml格式处理sql语句时,经常会用到< ,<=,>,>=等符号,但是很容易引起xml格式的错误,这样会导致后台将xml字符串转换为xml文档时报错,从而导致程序错误. 这样的问题在iBatiS中或者自定义的xml处理sql的程序中经常需要我们来处理.其实很简单,我们只需作如下替换即可避免上述的错误: 原符号   <    <=    >    >=     &      '       " 替换符号 < <= &

oracle中的exists 和not exists 用法 in与exists语句的效率问题

博文来源(oracle中的exists 和not exists 用法):http://chenshuai365-163-com.iteye.com/blog/1003247 博文来源(  in与exists语句的效率问题):http://www.cnblogs.com/iceword/archive/2011/02/15/1955337.html (一) exists (sql 返回结果集为真) not exists (sql 不返回结果集为真) 如下: 表A ID NAME 1    A1 2

ORACLE in与exists语句的区别(一)

(转载:https://www.cnblogs.com/iceword/archive/2011/02/15/1955337.html) select * from Awhere id in(select id from B) 以上查询使用了in语句,in()只执行一次,它查出B表中的所有id字段并缓存起来.之后,检查A表的id是否与B表中的id相等,如果相等则将A表的记录加入结果集中,直到遍历完A表的所有记录.它的查询过程类似于以下过程 List resultSet=[];Array A=(s

数据库表中存在Text类型的属性时,写sql语句时需要注意喽!

之前,习惯性地写查询语句时,查询条件用“=”判断.今天写程序的时候,查询时突然报了一个错误:数据类型text 和varchar 在equal to 运算符中不兼容.查看了一下数据库发现,其中有一个属性(例如Name:)是Text类型的,这时查询条件Name='张三' 就会报错.查找相关资料发现Text类型的属性不能用“=”判断相等,因为它不支持,可以用“like”判断,例如:Name like '张三' . 另外还有几点需要注意: (1):Text字段类型不能直接用replace函数来替换,必须

PL/SQL Developer中输入SQL语句时如何自动提示字段

在PL/SQL Developer中编写sql语句时,如果无法自动提示字段那是一件痛苦的事情,工作效率又低,在此演示下如何在PL/SQL Developer工具中自动提示字段,让开发者省时又省心,操作步骤如下:tools–>preferences–>user interface–>code assistant–>在右边选中authomatically activated即可,如 PL/SQL Developer中输入SQL语句时如何自动提示字段,布布扣,bubuko.com

nginx配置if错误语句时出错一例

server{ if (!-e $request_filename)        {                rewrite ^(.*)$ /index.php last;        } } 如果if 没有放在location时,在做memc缓存时,在错误日志里会提示以下信息 2014/05/12 10:45:51 [error] 11520#0: *325726 srcache_fetch: cache sent truncated response body while send

hive执行query语句时提示错误:org.apache.hadoop.ipc.RemoteException: java.io.IOException: java.io.IOException:

hive> select product_id, track_time from trackinfo limit 5; Total MapReduce jobs = 1 Launching Job 1 out of 1 Number of reduce tasks is set to 0 since there's no reduce operator org.apache.hadoop.ipc.RemoteException: java.io.IOException: java.io.IOEx

hive运行query语句时提示错误:org.apache.hadoop.ipc.RemoteException: java.io.IOException: java.io.IOException:

hive> select product_id, track_time from trackinfo limit 5; Total MapReduce jobs = 1 Launching Job 1 out of 1 Number of reduce tasks is set to 0 since there's no reduce operator org.apache.hadoop.ipc.RemoteException: java.io.IOException: java.io.IOEx