`

一条SQL的疑问

阅读更多
今天遇到了一个问题,查了一下SQL的执行顺序。http://www.blogjava.net/youling/archive/2009/03/06/243177.html
但是,还是没有解决问题。SQL如下:

update vip set lastlevelmodifieddate=b.adjustdate from vip a, (
select vipno, min(adjustdate) as adjustdate from vipleveladjustmentform
where currentlevel = '1' and lastlevel = '6' and
vipno in (select vipno from vip where joindate < '2010-03-10') group by vipno
)b
where a.vipno=b.vipno

最后,执行的结果居然把在b中不存在的vipno也修改了,不知道为什么?
希望以后找个机会解决,或者有高手也帮忙解决一下。当然,不一定要一模一样的数据库表,大家可以建立两个表,根据相同的原理试一下。例如下面两个表a,b.
CREATE TABLE a
(
  pk integer NOT NULL,
  vipno text,
  createddate timestamp with time zone,
  CONSTRAINT a_pkey PRIMARY KEY (pk)
)
WITHOUT OIDS;
ALTER TABLE a OWNER TO postgres;

CREATE TABLE b
(
  pk integer NOT NULL,
  vipno text,
  createddate timestamp with time zone,
  CONSTRAINT b_pkey PRIMARY KEY (pk)
)
WITHOUT OIDS;
ALTER TABLE b OWNER TO postgres;

然后插入数据,如下:
insert into a values (1, 'a001', '2010-01-05 19:53:36.208')
insert into a values (2, 'a002', '2010-01-05 19:53:36.208')

insert into b values (1, 'a001', '2010-01-01 19:53:36.208')

然后执行SQL:
update a set createddate=c.adjustdate from a as d, (
select vipno, min(createddate) as adjustdate from b group by vipno
)c
where d.vipno=c.vipno
结果表a中的两条数据的createddate都被修改了,为什么呢?
0
0
分享到:
评论
1 楼 laoshifu 2010-03-04  
经过一个多小时的尝试,发现了问题,发现update的表如果在from语句中使用了别名,貌似已经跟要update的表分离开了。例子中的SQL应该如下:
update a set createddate=c.adjustdate from (
select vipno, min(createddate) as adjustdate from b group by vipno
)c
where a.vipno=c.vipno

本来的问题的SQL应该如下:
update vip set lastlevelmodifieddate=b.adjustdate from (
select vipno, min(adjustdate) as adjustdate from vipleveladjustmentform
where currentlevel = '1' and lastlevel = '6' and
vipno in (select vipno from vip where joindate < '2010-03-10') group by vipno
)b
where vip.vipno=b.vipno

相关推荐

    一条SQL语句查询多个数据库

    需求:一条SQL语句从多个数据库查询出相关联的结果,输出到客户端 调查:spring框架可以配置多数据源;...以上所述是小编给大家介绍的一条SQL语句查询多个数据库 ,希望对大家有所帮助,如果大家有任何疑问请

    Oracle数据库的SQL语句的优化

    不同的情况,一条SQL可能有多种执行计划,但在某一时点,一定只有一种执行计划是最优的,花费时间是最少的。相信你一定会用Pl/sql Developer、Toad等工具去看一个语句的执行计划,不过你可能对Rule、Choose、First rows、...

    SqlServer 表单查询问题及解决方法

    Q1:表StudentScores如下,用一条SQL语句查询出每门课都大于80分的学生姓名 Q2:表DEMO_DELTE如下,删除除了自动编号不同,其他都相同的学生冗余信息 Q3:Team表如下,甲乙丙丁为四个球队,现在四个球对进行比赛,...

    Java web 课程设计(宿舍管理系统)

    而且在查询某条记录的时候,由于数据量庞大,只能依靠人工一条一条去查,效率极低。采用计算机来管理宿舍和学生信息,大大提高了查询速度,节约了人力物力,达到了预期的要求。 sql脚本我会后续上传,需要的可在我...

    oracle优化笔记

    计划,发现 SQL2 的执行计划也是全表扫描,这里 t1.name=的取值为 cc 的返回仅仅 10 条 记录,而 T1 表记录都在 5 千万左右, T2 表在 200 万左右,需要全扫这么大的两个表而获 取仅有的 10 记录吗? 这里又要再次...

    php-reports:一个PHP框架,用于显示来自任何数据源(包括SQL和MongoDB)的报告

    php报告一个报告框架,用于管理和显示来自任何数据源(包括SQL和MongoDB)的美观,可导出的报告。 主要功能包括: 从任何可以输出表格数据的数据源显示报告(SQL,MongoDB,PHP等) 以HTML,XML,CSV,JSON或您自己...

    对于 Oracle 的 rownum 问题

    =),并非说用&gt;,&gt;=,=,between..and 时会提示SQL语法错误,而是经常是查不出一条记录来,还会出现似乎是莫名其妙的结果来,其实您只要理解好了这个 rownum 伪列的意义就不应该感到惊奇,同样是伪列,rownum 与 rowid ...

    详解数据库语言中的null值

    虽然熟练掌握SQL的人对于Null不会有什么疑问,但总结得很全的文章还是很难找,看到一篇英文版的, 感觉还不错。 Tony Hoare 在1965年发明了 null 引用, 并认为这是他犯下的“几十亿美元的错误”. 即便是50年后的今天,...

    oracle 分页问题解决方案

    有问题就要找问题: 首先把2条查询结果相同的sql打印出来到数据库中执行: sql1: 代码如下: select * from (select t.*, rownum rn from (select t_e_id, t_e_name, t_e_tel, t_e_areacode from (select t.eid t_e...

    重要日期提醒节日记事本农历日期提醒

    显示日期信息详细(双击任意一条查询记录即可:如图中双击“25 2009/12/23 0:00:00 小年”即可查询该记录的详细信息) 皮肤设置界面 主要功能:修改各窗口的样式,颜色,透明度,图片的信息,颜色设置只需单击该...

    华创Office办公平台 v7.1.zip

    华创Office办公平台用于Office办公,可...每一条记录的每一次数据处理,都保留有何人、何时修改,更改前、更改后的值等历史数据,一旦出现疑问您可查阅操作日志,能完整了解该记录的处理过程。 华创Office办公平台截图

    会议信息管理系统详细设计

    学生成绩单录入部分可以对某一个学生进行成绩录入,但是一次只能录入一条成绩记录,同时可对缺考、免考、补考学生成绩进行录入。 学生成绩显示/修改部分可以对已录入的成绩进行显示和修改,但是只能对系统默认的当前...

    PB进阶代码(很全的)

    3.10 取当月的最后一天函数 -- GetLastDay 3.11 限制同一程序多次运行 -- OnlyOnce 本章所使用的资源文件 -- pic 第4章 数据库与SQL 4.2 PowerBuilder + ASA8的C/S编程 -- Client-Server 4.4 动态SQL及其应用 ...

    青果校园兼职网,阿赛企业网站管理

    42、阿赛防SQL注入程序商业版:阻挡通过地址栏、前台的一切不良信息,阻止一切类似SQL字符的字眼出现,进一步有效地增加网站整体的安全性能; 43、阿赛数据库在线管理商业版:支持在线压缩、备份、还原当前数据,...

Global site tag (gtag.js) - Google Analytics