提供7*24专业Sybase数据库远程及现场技术支持,Sybase ASE及Sybase SQL Anywhere数据库修复服务,
请联系电话: (微信),QQ: 289965371!
We supply technical support for Sybase ASE and Sybase SQL Anywhere, also have many years of experience in recovering data from damanged Sybase devices.
Please contact us:
Phone:
Wechat: 13811580958
QQ: 289965371 联系我们获取数据库技术支持!
Email: 289965371@qq.com
扫描下方微信,联系我们:
扫描雨翰数据恢复官方微信获取专业数据库恢复服务

 

随着Sybase被完全整合到SAP下,Sybase原来的支持网站被SAP Support Portal取代。
只有购买了SAP服务的用户才能使用账号登录SAP Support Portal进行介质下载、补丁升级、报Incident等。
目前,原Sybase所有产品(包括:Adaptive Server Enterprise、Sybase IQ、Replication Server、PowerDesigner等)的官方手册仍然可以从https://infocenter.sybase.com/help/index.jsp进行浏览或下载。暂不清楚该网站https://infocenter.sybase.com/help/index.jsp何时会被完全迁移到SAP Support上!
Sybase官方手册英文版有html和pdf两种格式,而中文版手册只有pdf一种格式。为了国内Sybase用户更方便、快捷地搜索Sybase常见产品的官方手册内容,特将中文版Sybase官方手册转为html格式!
Sybase产品官方手册中文版的html格式所有内容的版权归SAP公司所有!本博客站长是Sybase数据库的铁杆粉丝!

如有Sybase数据库技术问题需要咨询,请联系我!

  QQ :289965371 联系我们获取数据库技术支持!
  Email:

以下官方手册为ASE 15.7 ESD#2中文版:

  1. 新增功能公告 适用于 Windows、Linux 和 UNIX 的 Open Server 15.7 和 SDK 15.7
  2. 新增功能摘要
  3. 新增功能指南
  4. ASE 15.7 发行公告
  5. 配置指南(windows)
  6. 安装指南(windows)
  7. 参考手册:构件块
  8. 参考手册:命令
  9. 参考手册:过程
  10. 参考手册:表
  11. Transact-SQL® 用户指南
  12. 系统管理指南,卷 1
  13. 系统管理指南,卷 2
  14. 性能和调优系列:基础知识
  15. 性能和调优系列:锁定和并发控制
  16. 性能和调优系列:监控表
  17. 性能和调优系列:物理数据库调优
  18. 性能和调优系列:查询处理和抽象计划
  19. 性能和调优系列:使用 sp_sysmon 监控 Adaptive Server
  20. 性能和调优系列:利用统计分析改进性能
  21. 程序员参考 jConnect for JDBC 7.0.7
  22. Adaptive Server Enterprise 中的 Java
  23. 组件集成服务用户指南
  24. Ribo 用户指南
  25. 内存数据库用户指南
  26. Sybase Control Center for Adaptive Server® Enterprise
  27. 安全性管理指南
  28. 实用程序指南

 


< 上一个 | 内容 | 下一步 >

子查询工作方式


子查询又称为 内部查询,它出现于其它 SQL 语句的 where having 子句中,或出现于语句的选择列表中。子查询可用来处理表达为其 它查询的结果的查询请求。包含子查询的语句会依据子查询的 select 列表的求值来处理来自一个表的行,它可与外层查询引用相 同的表,也可以引用不同的表。在 Transact-SQL 中,子查询还可用 于允许使用表达式的几乎何地方,条件是子查询返回一个单值。 case 表达式也可包含子查询。

例如,下面的子查询列出 royalty split 值大于 $75 的所有作者的姓名:

select au_fname, au_lname from authors

where au_id in (select au_id

from titleauthor where royaltyper > 75)

包含一个或多个子查询的 select 语句有时也称为嵌套查询嵌套的

select 语句

不返回值的子查询的结果为 NULL。如果子查询返回 NULL,则此 查询失败。

请参见 《参考手册:命令》。


子查询限制


子查询存在如下限制:

除在 exists 子查询中外(通常以 (*) 代替单个列名),subquery_select_list 只能由一个列名组成。可以在不是 exists 子查询的嵌套 select 语句中 使用星号 ( * )

不要指定多个列名。如果列名所属的表或视图存在歧义,应用表名 或视图名限定列名。

子查询可嵌套于外层 selectinsertupdate delete 语句的 where having 子句中,或嵌套于另一个子查询或选择列表中。或者,也可 编写多个包含子查询的语句作为连接;Adaptive Server 将这种语句 作为连接来处理。

Transact-SQL 中,子查询可用于允许使用表达式的几乎任何地方, 条件是子查询返回一个单值。 SQL 派生表可以在使用了子查询的任 何地方用于该子查询的 from 子句。

不能在 order bygroup by compute by 列表中使用子查询。

不能在子查询中包括 for browse 子句。

不能在子查询中包括 union 子句,除非它在该子查询内是派生表表 达式的一部分。有关使用 SQL 派生表的详细信息,请参见 9 章 “ SQL 派生表

由比较运算符引入的内部子查询中的选择列表只能包含一个表达式 或列名,并且子查询必须返回单个值。在外层语句的 where 子句中 指定的列与在子查询选择列表中指定的列必须是连接兼容的。

不能在子查询中包含 textunitext image 数据类型。

子查询不能在内部处理其结果,也就是说子查询不能包含 order by

子句、 compute 子句或 into 关键字。

在由 declare cursor 定义的可更新游标的 select 子句中不允许有相关

(重复)子查询。

嵌套不能超过 50 层。

union 运算符两边最多可有 50 个子查询。

子查询的 where 子句可包含集合函数,但条件是该子查询必须在外 层查询的 having 子句中,并且集合值必须为外层查询的 from 子句中 的某表上的一列。


对来自子查询的结果表达式的限制与其它任何表达式的限制相同。 表达式的最大长度是 16K。请参见 《参考手册:构件块》中的第 4 章 “表达式、标识符和通配符”。


使用子查询的示例


若要查找与 Straight Talk About Computers 价格相同的书籍,请先查找

Straight Talk 的价格:

select price

from titles

where title = "Straight Talk About Computers"

price

-------------

$19.99


(1 row affected)

将第一个查询的结果用于第二个查询中,以查找与 Straight Talk 价格相 同的所有书籍:

select title, price from titles

where price = $19.99

title price

------------------------------------------ -----

The Busy Executive’s Database Guide 19.99

Straight Talk About Computers 19.99

Silicon Valley Gastronomic Treats 19.99

Prolonged Data Deprivation:Four Case Studies 19.99

使用子查询只需一步即可得到相同的结果:

select title, price from titles

where price = (select price

from titles

where title = "Straight Talk About Computers")

title price

--------------------------------------- -----

The Busy Executive’s Database Guide 19.99

Straight Talk About Computers 19.99

Silicon Valley Gastronomic Treats 19.99

Prolonged Data Deprivation:Four Case Studies 19.99

限定列名


语句中的列名由在同级的 from 子句中引用的表隐式限定。下例中,表名 publishers 隐式限定外层查询 where 子句中的 pub_id 列。在子查询的选择 列表中对 pub_id 的引用由该子查询的 from 子句 (即 titles 表)进行限定:

select pub_name from publishers where pub_id in

(select pub_id

from titles

where type = "business")

以下即为隐式假定生效时的查询:

select pub_name from publishers

where publishers.pub_id in (select titles.pub_id

from titles

where type = "business")

显式地规定表名永远都不会错,可通过使用显式限定来覆盖有关表名的 隐式假定。


带相关名的子查询


自连接中需要使用表相关名,因为与其自身连接的表以两种不同的角色 出现 (请参见 4 章 “连接:从若干表中检索数据)。可以在嵌套查 询 (这些查询的内层查询与外层查询引用同一个表)中使用相关名。

例如,查找与 Livia Karsen 居住在同一城市的作者:

select au1.au_lname, au1.au_fname, au1.city from authors au1

where au1.city in (select au2.city

from authors au2

where au2.au_fname = "Livia" and au2.au_lname = "Karsen")

au_lname

au_fname

city

-----------

---------

-------

Green

Marjorie

Oakland

Straight

Dick

Oakland

Stringer

Dirk

Oakland

MacFeather

Stearns

Oakland


Karsen Livia Oakland

显式相关名清楚地显示:在子查询中对 authors 的引用与在外部查询中 对 authors 的引用并不相同。

如果没有显式相关,则子查询为:

select au_lname, au_fname, city from authors

where city in (select city

from authors

where au_fname = "Livia" and au_lname = "Karsen")

或者,可将上述查询和其它语句 (其中的子查询与外部查询引用同一 个表)表述为自连接:

select au1.au_lname, au1.au_fname, au1.city from authors au1, authors au2

where au1.city = au2.city and au2.au_lname = "Karsen" and au2.au_fname = "Livia"

重申为连接的子查询返回结果的顺序可能会有所不同;此外,此连接可 能需要使用 distinct 关键字来消除重复项。


多重嵌套


子查询可包含一个或多个子查询。在一个语句中最多可嵌套 50 个子 查询。

例如,若要查找参与编写了至少一本计算机畅销书的作者的姓名,请 输入:

select au_lname, au_fname from authors

where au_id in (select au_id

from titleauthor where title_id in

(select title_id from titles

where type = "popular_comp") )

au_lname au_fname

---------------------- ------------

Carson Cheryl


Dull Ann

Locksley Chastity

Hunter Sheryl


(4 rows affected)

最外层查询选择所有的作者名。下一层查询查找作者 ID,最内层查询 返回标题 ID PC1035PC8888 PC9999

也可将此查询表示为一个连接:

select au_lname, au_fname

from authors, titles, titleauthor where authors.au_id = titleauthor.au_id

and titles.title_id = titleauthor.title_id and type = "popular_comp"


在嵌套 select 语句中使用星号

可以在不是 exists 子查询的嵌套 select 语句中使用星号 ( * ),只要星号满 足以下条件:

select 语句中的唯一一项。

对于嵌套查询可解析成单个表列。 此外,还可以:

通过使用 qualifier .* 格式 (其中 qualifier from 子句中的一个表) 将嵌套查询中的选定列限制为仅属于特定表的列。

在包括 group by 子句的嵌套查询中使用星号。

当星号针对嵌套查询解析为单个表列时,该查询等效于显式使用单个 表列。

以下是有效的嵌套查询,因为 t2 只有一列:

1> create table t1(c1 int, c2 int) 2> create table t2(c1 int)

3> go

1>select * from t1 where c1 in (select * from t2) 2>go

嵌套的 select 语句等效于:

1> select * t1 where c1 in (select c1 from t2) 2> go

在低于 15.7 Adaptive Server 版本中,只能在嵌套 exists 子查询中使用 星号。


使用表名限定符


可以在 qualifier.* qualifier <句点> 星号 )格式中使用星号,仅选择指定表 中的列,例如:

1> create table t1(c1 int, c2 int) 2> go

1> create table t2(c1 int) 2> go

1> select * from t1

2> where c1 in (select t2.* from t1, t2) 3> go

嵌套的 select 语句等效于:

1> select * from t1

2> where c1 in (select t2.c1 from t1, t2) 3> go


将嵌套查询和 group by 一起使用

只要 group-by 表只有一列,就可以在嵌套 group by 查询中使用星号, 例如:

1> select * from t1

2> where c1 in (select * from t2 group by c1) 3> go

此嵌套 group by 查询示例等效于:

1> select * from t1

2> where c1 in (select c1 from t2 group by c1) 3> go


示例

示例 1. 从没有销售或折扣大于 10 stores 中删除所有折扣:

create view store_with_nosales(stor_id) as

select stores.stor_id

from stores left join sales

on stores.stor_id = sales.stor_id where sales.stor_id IS NULL

go


delete from discounts

where (stor_id in (select *


from store_with_nosales) or discount > 10.0)

go

示例 2. 返回错误,因为 stores sales 之间的连接中有多个列:

create view store_with_nosales(stor_id) as

select stores.stor_id

from stores left join sales

on stores.stor_id = sales.stor_id where (stor_id in (select *

from stores left join sales

on stores.stor_id = sales.stor_id where sales.stor_id IS NULL)

or discount > 10.0) go


delete from discounts where (stor_id in (select *

from store_with_nosales) or discount > 10.0)

go


Msg 299, Level 16, State 1:

Line 1:

The symbol '*' can only be used for a subquery select list when the subquery is introduced with EXISTS or NOT EXISTS or the subquery references a single table and column.


用法

Adaptive Server 在保存新的存储过程、视图和触发器之前,自动将查询 中的星号替换为实际列名。这种替换会一直持续,即使您变更表以添加 列也是如此。但是,如果星号的替换引入额外的列, Adaptive Server 将 不允许多个列。这种不正确的行为将一直持续到您删除并重新创建该文 本为止。例如:

1> create table t1(c1 int, c2 int) 2> go

1> create table t2(c1 int) 2> go

1> create proc p1 2> as

3> select * from t1 where c1 in (select * from t2) 4> go


1> exec p1

2> go

c1 c2

----------- -----------


(0 rows affected) (return status = 0)


1> sp_helptext p1

2> go

# Lines of Text

---------------

2


(1 row affected) text

------------------------------------------------------

------------------------------------------------------

create proc p1

as/* Adaptive Server has expanded all '*' elements in the following statement */


select t1.c1, t1.c2

from t1 where c1 in (select t2.c1 from t2)


(2 rows affected) (return status = 0)

1> alter table t2 add c2 int null 2> go

1> exec p1

2> go

c1 c2

----------- -----------


(0 rows affected) (return status = 0)


1> exec p1 with recompile 2> go

c1 c2

----------- -----------


(0 rows affected) (return status = 0)

1> drop proc p1 2> go


1> create proc p1 2> as

3> select * from t1 where c1 in (select * from t2) 4> go

Msg 299, Level 16, State 1: Procedure 'p1', Line 4:

The symbol '*' can only be used for a non-EXISTS subquery select list when the subquery is on a single table with a single column.

Adaptive Server 要求星号解析为单个列,如果在转换星号之后遇到多个 列,则会生成错误。


update delete insert 语句中的子查询

可在 updatedelete insert 语句以及 select 语句中嵌套子查询。


image

注释 运行本节中的示例查询将更改 pubs2 数据库。如果在运行这些查 询之后需要原始的 pubs2 数据库,请要求系统管理员重新装载 pubs2 数 据库。

image


以下查询将 New Age Books 出版的所有书籍的价格加倍。此语句会更新

titles 表;其子查询引用 publishers 表。

update titles

set price = price * 2 where pub_id in

(select pub_id from publishers

where pub_name = "New Age Books")

使用连接的等效 update 语句为:

update titles

set price = price * 2 from titles, publishers

where titles.pub_id = publishers.pub_id and pub_name = "New Age Books"

用以下嵌套 select 语句删除所有商业书籍的销售记录:

delete salesdetail where title_id in

(select title_id

from titles


where type = "business")

使用连接的等效 delete 语句为:

delete salesdetail

from salesdetail, titles

where salesdetail.title_id = titles.title_id and type = "business"


条件语句中的子查询

在条件语句中可使用子查询。按下例所示,重新编写上述删除所有商业 书籍销售记录的子查询,以在删除这些记录之前对它们进行检查:

if exists (select title_id from titles

where type = "business") begin

delete salesdetail where title_id in

(select title_id from titles

where type = "business")

end


用子查询替代表达式

Transact-SQL 中, selectupdateinsert delete 语句中几乎所有可 使用表达式的地方都可用子查询来替代。例如,子查询可与外连接的内 部表中的列进行比较。

可将子查询用于 order by 列表中,或者将其用作 insert 语句的 values 列表 中的一个表达式。

以下语句显示如何查找由居住于 California 的作者所写并在那里出版的 书籍的标题和类型:

select title, type from titles

where title in (select title

from titles, titleauthor, authors

where titles.title_id = titleauthor.title_id and titleauthor.au_id = authors.au_id

and authors.state = "CA")


and title in (select title

from titles, publishers

where titles.pub_id = publishers.pub_id and publishers.state = "CA")

title type

----------------------------------- ----------

The Busy Executive’s Database Guide business Cooking with Computers:

Surreptitious Balance Sheets business Straight Talk About Computers business But Is It User Friendly? popular_comp

Secrets of Silicon Valley popular_comp

Net Etiquette popular_comp


(6 rows affected)

以下语句选择销量在 5000 册以上的书籍的书名,并列出其价格以及最 贵书籍的价格:

select title, price,

(select max(price) from titles) from titles

where total_sales > 5000

title

price

-----------------------------------

-----

------

You Can Combat Computer Stress!

2.99

22.95

The Gourmet Microwave

2.99

22.95

But Is It User Friendly?

22.95

22.95

Fifty Years in Buckingham Palace

Kitchens

11.95

22.95


(4 rows affected)




--------------------------------------华丽的分割线-------------------------------------------------------------------------

Sybase SQL Anywhere数据库恢复工具ReadASADB:

之前就已经研发成功了能够从Sybase SQL Anywhere的DB文件中恢复数据的工具: ReadASADB。
此工具支持ASA v5.0, v6.0, v7.0, v8.0, v9.0, v10.0, v11.0, v12.0, v16.0, v17.0等版本。
能够从损坏的SQL Anywhere数据文件(.db)和UltraLite数据文件(.udb)上提取数据的非常规恢复工具。
恢复Sybase SQL Anywhere的工具在国内处于领先水平。

Sybase SQL Anywhere数据库恢复工具ReadASADB功能
能够从损坏的SQL Anywhere数据文件(.db)和UltraLite数据文件(.udb)上提取数据的非常规恢复工具
  1. 适用于所有的SQL Anywhere版本    包括:5.x,6.x,7.x,8.x,9.x,10.x,11.x,12.x,16.x,17.x
  2. 适用于所有的UltraLite版本
  3. 能够恢复出来表结构和数据
  4. 能够恢复自定义数据类型
  5. 能够恢复存储过程等对象的语法
  6. 能够导出到目标数据库
  7. 能够导出到SQL文件并生成导入脚本
  8. 支持多种字符集,包括:cp850、cp936、gb18030、utf8等
  9. 能够恢复未加密或者简单加密类型的数据
  10. 简单易用
  11. 限制:不支持AES加密的数据文件
请参考:研发成功了从Sybase SQL Anywhere的DB文件上恢复数据的工具
            SQL Anywhere数据库非常规恢复工具ReadASADB使用介绍

Sybase SQL Anywhere数据库恢复工具ReadASADB适用场景

各种误操作:

  1. 误截断表(truncate table)
  2. 误删除表(drop table)
  3. 错误的where条件误删数据
  4. 误删除db或log文件
  5. 误删除表中的字段

Sybase SQL Anywhere数据库恢复工具ReadASADB的应用场景:

1.因为物理磁盘故障、操作系统、系统软件方面或者掉电等等原因导致的Sybase SQL Anywhere数据库无法打开的情况;
2.误操作,包括truncate table,drop table,不正确的where条件导致的误删除等;
Sybase SQL Anywhere无法打开时,比较常见的错误是:Assertion failed。
如:
1、Internal database error *** ERROR *** Assertion failed:201819 (8.0.1.2600) Checkpoint log: invalid bitmap page -- transaction rolled back
2、Internal database error *** ERROR *** Assertion failed:201819 (8.0.1.2600) Page number on page does not match page requested -- transaction rolled back
3、Internal database error *** ERROR *** Assertion failed:200502 (9.0.2.2451) Checksum failure on page 23 -- transaction rolled back
4、File is shorter than expected
5、Internal database error *** ERROR *** Assertion failed: 201116 Invalid free list index page found while processing checkpoint log -- transaction rolled back
6、*** ERROR *** Assertion failed: 51901 Page for requested record not a table page or record not present on page
7、*** ERROR *** Assertion failed: 201417 (7.0.4.3541) Invalid count or free space offset detected on a table page
8、Internal database error *** ERROR *** Assertion failed: 201425 (8.0.3.5594) Invalid count or free space offset detected on a free list page -- transaction rolled back.
9、Internal database error *** ERROR *** Assertion failed: 100702 (8.0.1.2600) Unable to modify indexes for a row referenced in rollback log -- transaction rolled back


-------------------------------------------------------------------------------------------

Sybase ASE数据库恢复工具READSYBDEVICE:

一个不依赖数据库管理系统、直接从Sybase数据库设备文件上提取数据的业内领先的恢复工具!
能够从损坏的Sybase ASE设备文件(.dat)上提取数据的非常规恢复工具。

Sybase ASE数据库恢复工具READSYBDEVICE的主要功能:

  1. 被勒索病毒加密数据文件及备份文件情况下的恢复;
  2. 系统崩溃只剩下数据文件的情况下的恢复,甚至数据库文件不存在而只有损坏的备份文件情况下的恢复;
  3. 因断电、硬盘坏道等造成数据库文件损坏情况下的恢复;
  4. delete数据恢复、误update数据恢复、误删除表(drop)恢复、误truncate表恢复 等;
  5. 各种Sybase内部系统表损坏、索引错误的修复;
  6. master数据库损坏而无法正常运行情况下的恢复;
  7. Sybase数据库被标记为可疑,不可用等情况的恢复;
  8. Sybase数据库中数据文件内部出现坏块情况下的恢复;
  9. Sybase数据库无数据文件但有日志文件的情况下的恢复;
  10. Sybase数据库只有数据文件无任何日志文件的情况下的恢复;
  11. Sybase数据文件被误删除情况下的碎片提取恢复;
  12. 磁盘阵列上的Sybase数据库被误格式化情况下的数据库恢复;
  13. 数据库sysobjects等系统表损坏无法正常应用情况下的恢复;
  14. Sybase数据库还原数据库出现失败情况下的恢复;
  15. Sybase数据库只剩下损坏的备份文件情况下的恢复。

Sybase ASE数据库恢复工具READSYBDEVICE支持的版本:

Sybase ASE 11.0.x,11.5.x,11.9.x,12.0.x,12.5.x,15.0.x,15.5.x,15.7.x,16.0.x


-------------------------------------------------------------------------------------------

SQL Server数据库恢复工具SQLRescue:

一个不依赖数据库管理系统、直接从SQL Server数据库文件上提取数据的业内领先的恢复工具!
能够从损坏的SQL Server数据库文件(.mdf)上提取数据的非常规恢复工具。

SQL Server数据库恢复工具SQLRescue的主要功能:

  1. 系统崩溃只剩下数据文件的情况下的恢复,即无日志文件或者日志文件损坏情况下的恢复;
  2. 断电导致数据库文件损坏情况下的恢复;
  3. 硬盘坏道造成数据库损坏情况下的恢复;
  4. 数据文件内部存在坏页情况下的恢复;
  5. 企业管理器误删除数据表记录,管理软件误删除数据表记录的恢复;
  6. 并闩锁错误、格式化、误删除后导致软件不能使用的情况;
  7. 无法读取并闩锁页sysindexes失败情况下的修复;
  8. 数据文件被误删除情况下的碎片提取恢复;
  9. 系统表损坏、索引错误、误删除数据库表、删除记录的数据找回;
  10. master数据库损坏而无法正常运行情况下的恢复;
  11. 数据文件无法附加情况下的数据恢复;
  12. 数据库被标记为可疑,质疑,不可用等情况的恢复;
  13. 数据库sysobjects等系统表损坏情况下的恢复;
  14. 数据被误(drop、delete、truncate)删除表数据的恢复,误update后的数据恢复等;
  15. 还原时报一致性错误,错误823等情况下的数据恢复,各种错误提示的数据库文件修复;
  16. 数据库被误格式化等情况下的数据库恢复;
  17. 日志收缩造成数据库损坏情况下的恢复;
  18. 仅剩损坏的备份文件情况下的恢复。

SQL Server数据库恢复工具SQLRescue技术特点:

只要SQL Server数据库的数据文件存在,我们就有办法帮您从数据文件中找回重要数据。
  1. 从数据文件中直接恢复数据
  2. 不能附加时直接恢复数据并生成新的数据库
  3. 系统表损坏的数据库修复
  4. 快速修复SQL 823错误、连接中断错误

SQL Server数据库恢复工具SQLRescue支持的版本:

Microsoft SQL Server 7.0, 2000, 2005, 2008, 2008R2, 2012, 2014, 2016, 2017,2019。
+-------------------------------------华丽的分割线-------------------------------------------------------------------------