12
返回列表 发新帖
楼主: langfanyun11

[原创] 请教:关于子查询的一个sql的写法

[复制链接]
论坛徽章:
0
11#
 楼主| 发表于 2010-11-17 21:19 | 只看该作者
下面2个SQL错在什么地方,应该怎么修改,初学Sybase,请多指教。
把PRODUCT_NO_2,3 SERIAL_NO_2,3省略了。

1. 使用临时表#T2010,不能用它的值delete或update么。
FOR XXX AS cursXXX CURSOR FOR
  SELECT
  T1.PRODUCT_NO_1 AS T1_PRODUCT_NO_1,
  T1.SERIAL_NO_1 AS T1_SERIAL_NO_1,
  T1.SUB_PRODUCT_NO_1 AS T1_SUB_PRODUCT_NO_1,
  T1.SUB_SERIAL_NO_1 AS T1_SUB_SERIAL_NO_1,
  T2.PRODUCT_NO_1 AS T2_PRODUCT_NO_1,
  T2.SERIAL_NO_1 AS T2_SERIAL_NO_1
  FROM T1, T2
  WHERE
  T1.SUB_SERIAL_NO_1 = T2.SUB_SERIAL_NO_1
DO
  SELECT * INTO #T2010
  FROM T1
  WHERE T1.PRODUCT_NO_1 = T1_PRODUCT_NO_1
  AND T1.SERIAL_NO_1 = T1_SERIAL_NO_1
  AND T1.SUB_PRODUCT_NO_1 = T2_PRODUCT_NO_1
  AND T1.SUB_SERIAL_NO_1 = T2_SERIAL_NO_1

  DELETE
  FROM T1
  WHERE SERIAL_NO_1 = #T2010.SERIAL_NO_1
  AND SUB_SERIAL_NO_1 = #T2010.SUB_SERIAL_NO_1

END FOR ;

错误:Correlation name '#T2010' not found
SQLCODE=-142, ODBC 3 State="42S02"

---------------------------------------------------
2.  
FOR XXXX AS cursXXXX CURSOR FOR
  SELECT
  T1.PRODUCT_NO_1 AS T1_PRODUCT_NO_1,
  T1.SERIAL_NO_1 AS T1_SERIAL_NO_1,
  T1.SUB_PRODUCT_NO_1 AS T1_SUB_PRODUCT_NO_1,
  T1.SUB_SERIAL_NO_1 AS T1_SUB_SERIAL_NO_1,
  T2.PRODUCT_NO_1 AS T2_PRODUCT_NO_1,
  T2.SERIAL_NO_1 AS T2_SERIAL_NO_1
  FROM T1, T2
  WHERE
  T1.SUB_SERIAL_NO_1 = T2.SUB_SERIAL_NO_1
FOR UPDATE
DO
  DELETE
  FROM T1
  WHERE T1.PRODUCT_NO_1 = T1_PRODUCT_NO_1
  AND T1.SERIAL_NO_1 = T1_SERIAL_NO_1
  AND T1.SUB_PRODUCT_NO_1 = T2_PRODUCT_NO_1
  AND T1.SUB_SERIAL_NO_1 = T2_SERIAL_NO_1

  UPDATE T1
  SET T1_SUB_PRODUCT_NO_1 = T2_PRODUCT_NO_1,
  T1_SUB_SERIAL_NO_1 = T2_SERIAL_NO_1
  WHERE CURRENT OF cursXXXX ;
END FOR ;

错误:Update operation attempted on non-updatable query
  SQLCODE=-192, ODBC 3 State="42000"

试图去更新一个不可更新的查询。是什么原因导致的啊?不明白错在哪儿。
-----
Error 192

"Update operation attempted on non-updatable query"

Probable cause

You attempted an insert, update, or delete operation on a query that is implicitly read-only. Queries that contain DISTINCT, GROUP BY, HAVING, EXCEPT, INTERSECT or UNION, or that contain aggregate functions, or that involve a join, are implicitly read-only. If the query references a view then the view may be non-updatable.

使用道具 举报

回复
论坛徽章:
9
2009日食纪念
日期:2009-07-22 09:30:00ITPUB8周年纪念徽章
日期:2009-09-27 10:21:21祖国60周年纪念徽章
日期:2009-10-09 08:28:002010新春纪念徽章
日期:2010-03-01 11:19:10ITPUB9周年纪念徽章
日期:2010-10-08 09:31:22ITPUB十周年纪念徽章
日期:2011-11-01 16:23:262012新春纪念徽章
日期:2012-01-04 11:53:54ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:152013年新春福章
日期:2013-02-25 14:51:24
12#
发表于 2010-11-18 09:20 | 只看该作者
1,试下 delete T1 from  #T2010 T2 where T1....=T2.........and.....
2,有可能是版本问题,请升级至15版本。

使用道具 举报

回复
论坛徽章:
0
13#
 楼主| 发表于 2010-11-18 12:57 | 只看该作者
1.
SELECT * INTO #T2010
  FROM T1
  WHERE T1.PRODUCT_NO_1 = T1_PRODUCT_NO_1
  AND T1.SERIAL_NO_1 = T1_SERIAL_NO_1
  AND T1.SUB_PRODUCT_NO_1 = T2_PRODUCT_NO_1
  AND T1.SUB_SERIAL_NO_1 = T2_SERIAL_NO_1;

  DELETE T1
  FROM #T2010
  WHERE SERIAL_NO_1 = #T2010.SERIAL_NO_1
  AND SUB_SERIAL_NO_1 = #T2010.SUB_SERIAL_NO_1
....
还是报错:
Could not execute statement.
Item '#T2010' already exists
SQLCODE=-110 ...

2.版本:
Sybase IQ/12.7.0/

版本暂时没法升级啊,希望是程序问题吧。。

使用道具 举报

回复
论坛徽章:
0
14#
 楼主| 发表于 2010-11-22 08:49 | 只看该作者
问题已解决,谢谢各位的帮助。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表