提供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. 实用程序指南

 


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

外连接


包括所有行而不管是否有匹配行的连接称为 外部连接Adaptive Server 支持左外连接和右外连接。例如,以下查询通过 titles titleauthor 表的 title_id 列连接这两个表。

select *

from titles, titleauthor

where titles.title_id *= titleauthor.title_id

Sybase 支持 Transact-SQL ANSI 外连接。Transact-SQL 外连接使用 *= 命令表示左外连接,使用 =* 命令表示右外连接。Transact-SQL 外连接由 Sybase 创建,作为 Transact-SQL 语言的一部分。请参见 143 页的 “ Transact-SQL 外连接

ANSI 外部连接使用关键字 left join right join 分别表示左连接和右连接。 Sybase 执行 ANSI 外连接语法以完全符合 ANSI 标准。请参见 128 页 的 “ ANSI 内部和外连接 。下面按 ANSI 外连接重写先前示例:

select *

from titles left join titleauthor

on titles.title_id = titleauthor.title_id


内部表和外部表


术语 外部表内部表说明外部连接中表的位置:

左连接 中,外部表内部表分别是左表和右表。外部表和内部表 也分别称为行保留表和空值提供表。

右连接 中,外部表和内部表分别是右表和左表。 例如,在下面查询中, T1 是外部表, T2 是内部表:

T1 left join T2 T2 right join T1

或使用 Transact-SQL 语法:

T1 *= T2 T2 =* T1


外连接限制


如果表是外连接的内部成员,则无法参与外连接子句和常规连接子句。 以下查询失败,因为 salesdetail 表是外连接和常规连接子句的一部分:

select distinct sales.stor_id, stor_name, title from sales, stores, titles, salesdetail

where qty > 500

and salesdetail.title_id =* titles.title_id and sales.stor_id = salesdetail.stor_id

and sales.stor_id = stores.stor_id

Msg 303, Level 16, State 1: Server ’FUSSY’, Line 1:

The table ’salesdetail’ is an inner member of an outer- join clause.This is not allowed if the table also participates in a regular join clause.

如果要知道销售超过 500 册书籍的商店名称,必须使用另一个查询。如 果提交具有外连接的查询,且带有外连接的内部表中列的限定条件,则 可能不得到预期结果。查询中的限定条件没有限制返回的行数,而是影 响包含空值的行。对于不符合限定条件的行,空值显示在那些行的内部 表列上。


用于外连接的视图


如果定义带有外连接的视图,然后使用外连接的内部表中列的限定条件 查询该视图,则可能不会得到预期结果。查询返回内部表的所有行。不 满足限条件的行在这些行的相应列中显示为空值。

下列规则确定了可通过连接视图对列进行更新的类型:

连接视图中不允许使用 delete 语句。

在用 with check option 创建的连接视图中不允许使用 insert 语句。

在用 with check option 创建的连接视图中,允许使用 update 语句。如 果任何受影响的列出现在 where 子句中,或出现在包含来自多个表 的列的表达式中,更新将会失败。

如果通过连接视图来插入或更新行,所有受影响的列都必须属于同 一基表。


ANSI 内部和外连接

下面是连接表的 ANSI 语法:

left_table [inner | left [outer] | right [outer]] join right_table

on left_column_name = right_column_name

左表和右表间的连接结果称为连接表。连接表在 from 子句中定义。例如:

select titles.title_id, title, ord_num, qty from titles left join salesdetail

on titles.title_id = salesdetail.title_id

title_id title ord_num qty

BU1032

The Busy Executive

AX-532-FED-452-2Z7

200

BU1032

The Busy Executive

NF-123-ADS-642-9G3

1000

. . .

TC7777

Sushi, Anyone?

ZD-123-DFG-752-9G8

1500

TC7777

Sushi, Anyone?

XS-135-DER-432-8J2

1090

BU1032

The Busy Executive

AX-532-FED-452-2Z7

200

BU1032

The Busy Executive

NF-123-ADS-642-9G3

1000

. . .

TC7777

Sushi, Anyone?

ZD-123-DFG-752-9G8

1500

TC7777

Sushi, Anyone?

XS-135-DER-432-8J2

1090

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


(118 rows affected)


ANSI 连接语法允许编写如下任一项目:

内部连接,连接表仅包括满足 on 子句条件的内部表和外部表的行。 请参见 130 页的 “ ANSI 内连接 。对于不满足 on 子句条件的外 部表中的行,包含内连接的查询所得到的结果集中并不包含任何空 值行。


外连接,连接表包括外部表中的所有行,不论外部表是否满足 on 子 句条件。如果某行不满足 on 子句条件,则内部表的值将作为空值存 储在连接表中。 ANSI 外连接中的 where 子句将限制查询结果中的 行。请参见 133 页的 “ ANSI 外连接


image

注释 也可使用 ANSI 语法连接视图。

image

Sybase ANSI 连接语法不支持 using 子句。


ANSI 连接的相关名和列引用规则

下列是专用于 ANSI 连接的相关名和列引用规则。请参见 121 页的 “自连接和相关名

如果表或视图使用引用列或视图的相关名,它必须始终使用同一相 关名,而不能使用该表名或视图名。即,不能在查询中用相关名命 名表后又使用其名。以下示例正确使用相关名 t 指定已指定其 pub_id 列的表:

select title, t.pub_id, pub_name from titles t left join publishers p on t.pub_id = p.pub_id

然而,以下示例未使用查询 on 子句中 titles ( t.pub_id ) 的相关名, 而是错误地使用了表名,从而生成错误消息:

select title, t.pub_id, pub_name from titles t left join publishers p on titles.pub_id = p.pub_id

Msg 107, Level 15, State 1: Server ‘server_name’, Line 1:

The column prefix ‘t’ does not match with a table name or alias name used in the query.Either the table is not specified in the FROM clause or it has a correlation name which must be used instead.

on 子句中指定的限制可引用:

在连接表的引用中指定的列

ANSI 连接 (如嵌套连接)中包含的连接表中指定的列

在外部查询块中指定的表的子查询中的相关名

on 子句中指定的条件不能引用包含另一 ANSI 连接的 ANSI 连接 中引入的列 (通常当第二连接与第一连接进行连接生成连接表时)。



select *

下面是非法列引用生成错误的一个示例:

from titles left join titleauthor

on titles.title_id=roysched.title_id /*join #1*/ left join roysched

on titleauthor.title_id=roysched.title_id /*join #2*/ where titles.title_id != "PS7777"

第一个左连接无法引用 roysched.title_id 列,因为此列直到第二连接 后才被引入。可正确重写此查询为:

select * from titles

left join (titleauthor left join roysched

on titleauthor.title_id = roysched.title_id) /*join #1*/ on titles.title_id = roysched.title_id /*join #2*/ where titles.title_id != "PS7777"

另一个示例为:

select title, price, titleauthor.au_id, titleauthor.title_id, pub_name, publishers.city

from roysched, titles left join titleauthor

on roysched.title_id=titleauthor.title_id left join authors

on titleauthor.au_id=roysched.au_id, publishers

在此查询中, roysched 表或 publishers 表都不是任意左连接的一部 分。因此,任何左连接都无法引用任一 roysched publishers 表作为 其 on 子句条件的一部分。


ANSI 内连接


生成仅包括满足限制条件连接表行的结果集的连接称为 内部连接 。连接 表中不包括不满足连接限制条件的行。如果要求连接表包括一个表的所 有行,而不管它们是否满足限制条件,使用外连接。请参见 133 页的 “ ANSI 外连接

Adaptive Server 支持使用 Transact-SQL 内部连接和 ANSI 内部连接。使 用 Transact-SQL 内连接的查询用逗号分隔被连接的表,并在 where 子句 中列出连接比较和限制条件。例如:

select au_id, titles.title_id, title, price from titleauthor, titles

where titleauthor.title_id = titles.title_id and price > $15


请参见 113 页的 “如何使连接结构化

ANSI-standard inner join syntax is:

select select_list

from table1 inner join table2

on join_condition

例如,下面示例使用 inner join,等同于上述 Transact-SQL 连接:

select au_id, titles.title_id, title, price from titleauthor inner join titles

and price >

15

au_id

title_id title

price

----------

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

-----

213-46-8915

BU1032 The Busy Executive’s Datab

19.99

409-56-7008

BU1032 The Busy Executive’s Datab

19.99

. . .

172-32-1176

PS3333 Prolonged Data Deprivation

19.99

807-91-6654

TC3218 Onions, Leeks, and Garlic:

20.95

and price >

15

au_id

title_id title

price

----------

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

-----

213-46-8915

BU1032 The Busy Executive’s Datab

19.99

409-56-7008

BU1032 The Busy Executive’s Datab

19.99

. . .

172-32-1176

PS3333 Prolonged Data Deprivation

19.99

807-91-6654

TC3218 Onions, Leeks, and Garlic:

20.95

on titleauthor.title_id = titles.title_id


(11 rows affected)


编写连接的两个方法 ANSI Transact-SQL 等同。例如,下列查询生成 的结果集间没有区别:

select title_id, pub_name from titles, publishers

where titles.pub_id = publishers.pub_id

以及:

select title_id, pub_name

from titles left join publishers

on titles.pub_id = publishers.pub_id

内部连接可以是 update delete 语句的一部分。例如,下列是对于在

California 出版的所有书目价格乘以 1.25 的查询:

begin tran update titles

set price = price * 1.25

from titles inner join publishers on titles.pub_id = publishers.pub_id and publishers.state = "CA"


内连接的连接表


ANSI 连接指定在查询中要连接的表或视图。ANSI 连接中指定的表引用 构成连接表。例如,以下查询的连接表包括 titlepriceadvance royaltyper 列:

select title, price, advance, royaltyper from titles inner join titleauthor

on titles.title_id = titleauthor.title_id

title price advance royaltyper

----------- ------- ---------- ---------- The Busy... 19.99 5,000.00 40

The Busy... 19.99 5,000.00 60

. . .

Sushi, A... 14.99 8,000.00 30

Sushi, A... 14.99 8,000.00 40

(25 rows affected)

如果连接表用作 ANSI 内部连接中的表引用,则它成为嵌套内部连接。

ANSI 嵌套内连接遵循与 ANSI 外连接相同的规则。

查询在联合的每一侧可引用最多 50 个用户表 (或 14 个工作表),包括:

from 子句中列出的基表或视图

对同一表的每个相关引用 (自连接)

在子查询中引用的表

视图或嵌套视图引用的基表

into 创建的表


ANSI 内连接的 on 子句


ANSI 内部连接的 on 子句指定表或视图连接时所使用的条件。虽然可在 表的任何列上使用连接,但如果这些列编入索引可能会更好地提高性 能。通常必须使用限定符 (表名或相关名)唯一地标识列及其所属表。 例如:

from titles t left join titleauthor ta on t.title_id = ta.title_id

on 子句消除了没有匹配的 title_id 的两个表中的行。请参见 121 页 的 “自连接和相关名

on 子句通常与 ANSI 连接表进行比较,如以下查询的第三行和第四行 所示:

select title, price, pub_name from titles inner join publishers


on titles.pub_id = publishers.pub_id and total_sales > 300

在此 on 子句中指定的连接限制条件从连接表中删除销售额不大于 300 的所有行。 on 子句可包括 and 限定符以进一步指定搜索参数,如此查 询的第四行所示。

无论限制条件放置在 on 子句还是 where 子句中, ANSI 内连接对结果集 的限制都类似 (除非它们嵌套到外连接中)。即,以下查询生成相同结 果集:

select stor_name, stor_address, ord_num, qty from salesdetail inner join stores

on salesdetail.stor_id = stores.stor_id where qty > 3000

以及:

select stor_name, stor_address, ord_num, qty from salesdetail inner join stores

on salesdetail.stor_id = stores.stor_id and qty > 3000

如果限制条件放置在 where 子句中,查询通常更易读;它明确指示用户 结果集中包括哪些连接表的行。


ANSI 外连接


生成包括外部表所有行的连接表的连接 (不管 on 子句是否生成匹配 行),则称为外连接。内连接和等值连接生成的结果集仅包括在连接子 句中存在匹配值的表中的行。然而,有时不但要包括匹配行,而且要包 括在第二个表中没有匹配行一个表中的行。此类连接为外连接。在外连 接中,对于外连接的内部表,具有空值的连接表中包括不满足 on 子句 条件的行。内部表也称为空值提供成员。

Sybase 建议您的应用程序使用 ANSI 外连接,其原因在于 ANSI 外连接 明确指定了是 on 还是 where 子句包含谓词。

本节仅论述 ANSI 外部连接;有关 Transact-SQL 外部连接的信息,请参 见 143 页的 “ Transact-SQL 外连接


image

注释 包含 ANSI 外连接的查询不能包含 Transact-SQL 外连接,反之亦 然。然而,具有 ANSI 外连接的查询可引用包含 Transact-SQL 外连接的 视图,反之亦然。

image


ANSI 外连接语法为:

select select_list

from table1 {left | right} [outer] join table2

on predicate

[join restriction]

左连接将保留在连接子句左侧列出的表引用的所有行;右连接将保留在 连接子句右侧列出的表引用的所有行。在左连接中,左表引用称为外部 表或行留表。

下列示例确定与出版者居住在同一城市的作者:

select au_fname, au_lname, pub_name from authors left join publishers on authors.city = publishers.city au_fname au_lname pub_name

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

Johnson White NULL

Marjorie Green NULL

Cheryl Carson Algodata Infosystems

. . .

Abraham Bennet Algodata Infosystems

. . .

Anne Ringer NULL

Albert Ringer NULL (23 rows affected)

结果集包括 authors 表中的所有作者。当作者与他们的出版者不居住同 一城市时, pub_name 列中的值就为空。只有 Cheryl Carson Abraham Bennet 与他们的出版者居住在同一城市,这两位作者在 pub_name 列中 产生非空值。

可通过在 from 子句中调换表位置,将左外连接重写为右外连接。另外, 如果 select 语句指定 “select *”,则必须编写所有列名的显式列表,否 则结果集中的列可能与重写查询顺序不同。

下面将先前示例重写为右外连接,这样生成与上述左外连接相同的结 果集:

select au_fname, au_lname, pub_name from publishers right join authors on authors.city = publishers.city


谓词应放在 on 中还是放在 where 子句中?

ANSI 外部连接的结果集取决于在 on 还是 where 子句中放置限制条件。 on 子句定义连接表的结果集和此连接表具有空值的行;where 子句定义 要在结果集中包括的连接表的行。

在连接条件中使用 on 还是 where 子句,取决于要在结果集中包括的内 容。下列示例有助于决定将谓词放置在 on 还是 where 子句中。

外部表上的谓词限制 下列查询在 where 子句中放置了外部表的限制条件。因为限制条件应用 于外连接的结果,所以它删除条件非真的所有行:

select title, titles.title_id, price, au_id from titles left join titleauthor

on titles.title_id = titleauthor.title_id where titles.price > $20.00

title title_id price au_id

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

But Is It User F...PC1035

22.95

238-95-7766

Computer Phobic ...PS1372

21.59

724-80-9391

Computer Phobic ...PS1372

21.59

756-30-7391

Onions, Leeks, a...TC3218

20.95

807-91-6654

(4 rows affected)

有四行满足标准并且结果集中仅包括这些行。

然而,如果将外部表的此限制条件移到 on 子句中,则结果集包括满足

on 子句条件的所有行。外部表中不满足条件的行为空扩展行:

select title, titles.title_id, price, au_id from titles left join titleauthor

title

title_id

price

au_id

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

---------

------

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

The Busy Executive’s

BU1032

19.99

NULL

Cooking with Compute

BU1111

11.95

NULL

You Can Combat Compu

BU2075

2.99

NULL

Straight Talk About

BU7832

19.99

NULL

Silicon Valley Gastro

MC2222

19.99

NULL

The Gourmet Microwave

MC3021

2.99

NULL

The Psychology of Com

MC3026

NULL

NULL

But Is It User Friend

PC1035

22.95

238-95-7766

Secrets of Silicon Va

PC8888

20.00

NULL

Net Etiquette

PC9999

NULL

NULL

Computer Phobic and

PS1372

21.59

724-80-9391

Computer Phobic and

PS1372

21.59

756-30-7391

Is Anger the Enemy?

PS2091

10.95

NULL

title

title_id

price

au_id

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

---------

------

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

The Busy Executive’s

BU1032

19.99

NULL

Cooking with Compute

BU1111

11.95

NULL

You Can Combat Compu

BU2075

2.99

NULL

Straight Talk About

BU7832

19.99

NULL

Silicon Valley Gastro

MC2222

19.99

NULL

The Gourmet Microwave

MC3021

2.99

NULL

The Psychology of Com

MC3026

NULL

NULL

But Is It User Friend

PC1035

22.95

238-95-7766

Secrets of Silicon Va

PC8888

20.00

NULL

Net Etiquette

PC9999

NULL

NULL

Computer Phobic and

PS1372

21.59

724-80-9391

Computer Phobic and

PS1372

21.59

756-30-7391

Is Anger the Enemy?

PS2091

10.95

NULL

on titles.title_id = titleauthor.title_id and titles.price > $20.00


Life Without Fear

PS2106

7.00

NULL

Prolonged Data Depri

PS3333

19.99

NULL

Emotional Security:

PS7777

7.99

NULL

Onions, Leeks, and Ga

TC3218

20.95

807-91-6654

Fifty Years in Buckin

TC4203

11.95

NULL

Sushi, Anyone?

TC7777

14.99

NULL

(19 rows affected)

将限制条件移动到 on 子句向结果集中增加了 15 个空值行。

通常,如果查询使用外部表的限制条件,并且想要结果集仅删除限制条 件为假的行,可能应在 where 子句中放置限制条件,以限制结果集的行。 如果外部表谓词在 on 子句上,则它们不用于索引键。

on 还是 where 子句中放置外部表的限制条件最终取决于需要查询返回 的信息。如果希望结果集仅包括限制条件为真的行,则在 where 子句中 放置限制条件。然而,如果结果集必须包括外部表的所有行,而不管它 们是否满足限制条件,则在 on 子句中放置限制条件。

内部表的限制 以下查询在 where 子句中包括内部表的限制条件:

select title, titles.title_id, titles.price, au_id from titleauthor left join titles

on titles.title_id = titleauthor.title_id where titles.price > $20.00

title

title_id

price

au_id

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

--------

-----

-----------

But Is It U...

PC1035

22.95

238-95-7766

Computer Ph...

PS1372

21.59

724-80-9391

Computer Ph...

PS1372

21.59

756-30-7391

Onions, Lee...

TC3218

20.95

807-91-6654

(4 rows affected)

因为 where 子句的限制条件在连接后应用于结果集,所以结果集中限制 条件非真的所有行都会被删除。换句话说, where 子句对于所有提供的 空值为非真并将其删除。将其限制条件放置在 where 子句的连接是一个 有效内连接。

然而,如果将限制条件移动到 on 子句中,则它适用于连接过程中,并 在生成连接表时利用它。在这种情况下,结果集包括内部表中限制条件 为真的所有行,以及外部表的所有行 (如果这些行不满足限制标准则 为空扩展行):

select title, titles.title_id, price, au_id from titleauthor left join titles

on titles.title_id = titleauthor.title_id and price > $20.00


title

title_id

price

au_id

---------

---------

-----------

-----------

NULL

NULL

NULL

172-32-1176

NULL

NULL

NULL

213-46-8915

. . .

Onions,

TC3218

20.95

807-91-6654

. . .

NUL

NULL

NULL

998-72-3567

NULL

NULL

NULL

998-72-3567

(25 rows a

ffected)


在内部和外部表中包括 的限制

此结果集包括先前示例未包括的 21 行。

通常,如果查询需要对内部表的限制条件 (例如,上述查询中的 “ and price > $20.00”),请此条件放置到 on 子句中;这样将保留外部表的行。 如果在 where 子句中包括内部表的限制条件,则结果集可能不包括外部 表的行。

与在外部表上放置限制标准一样,将内部表的限制条件放置到 on 还是 where 子句上,最终取决于所需的结果集。如果只对限制条件为真的行 感兴趣,则将限制条件放置在 where 子句中。然而,如果需要结果集包 括外部表的所有行,而不管它们是否满足限制条件,则在 on 子句中放 置限制条件。

下列查询的 where 子句中的限制条件包括内部表和外部表:

select title, titles.title_id, price, price*qty, qty from salesdetail left join titles

on titles.title_id = salesdetail.title_id where price*qty > $30000.00


title

title_id

price

qty

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

--------

-----

---------

-----

Silicon Valley Ga

MC2222

19.99

40,619.68

2032

But Is It User Fr

PC1035

22.95

45,900.00

2000

But Is It User Fr

PC1035

22.95

45,900.00

2000

But Is It User Fr

PC1035

22.95

49,067.10

2138

Secrets of Silico

PC8888

20.00

40,000.00

2000

Prolonged Data De

PS3333

19.99

53,713.13

2687

Fifty Years in Bu

TC4203

11.95

32,265.00

2700

Fifty Years in Bu

TC4203

11.95

41,825.00

3500

(8 rows affected)


where 子句中放置限制条件会消除:

限制条件 “price*qty>$30000.0”为假的行

限制条件 “price*qty>$30000.0”为未知的行,因为 price 为空 要保留外部表的不匹配行,请将限制条件移动到 on 子句:

select title, titles.title_id, price, price*qty, qty from salesdetail left join titles

on titles.title_id = salesdetail.title_id and price*qty > $30000.00


title

title_id

price

qty

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

--------

-----

---------

-----

NULL

NULL

NULL

NULL

75

NULL

NULL

NULL

NULL

75

. . .

Secrets of Silico

PC8888

20.00

40,000.00

2000

. . .

NULL

NULL

NULL

NULL

300

NULL

NULL

NULL

NULL

400

(116 rows affected)

此查询在结果集中保留 salesdetail 表的所有 116 行,如果该表中的行不 满足限制条件则为空扩展行。

放置包括内部和外部表的限制条件的位置取决于所需的结果集。如果只 对限制条件为真的行感兴趣,则将限制条件放置在 where 子句中。然而, 若要包括外部表的所有行,而不管它们是否满足限制条件,则在 on 子 句中放置限制条件。


嵌套 ANSI 外连接


嵌套外部连接使用一个外部连接的结果集作为另一个外部连接的表引用。 例如:

select t.title_id, title, ord_num, sd.stor_id, stor_name

from (salesdetail sd left join titles t

on sd.title_id = t.title_id) /*join #1*/ left join stores

on sd.stor_id = stores.stor_id /*join #2*/ title_id title ord_num stor_id stor_name

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


TC3218

Onions, L...

234518

7896

Fricative

Bookshop

TC7777

Sushi, An...

234518

7896

Fricative

Bookshop

. . .

TC4203

Fifty Yea...

234518

6380

Eric the Read

Books

TC3218

Onions, L...

234518

7896

Fricative

Bookshop

TC7777

Sushi, An...

234518

7896

Fricative

Bookshop

. . .

TC4203

Fifty Yea...

234518

6380

Eric the Read

Books

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


MC3021 The Gourmet... 234518 6380 Eric the Read Books

(116 rows affected)

在此示例中, salesdetail titles 表间的连接表在逻辑上首先生成,然后, 在 salesdetail.stor_id 等于 stores.stor_id 时,与 stores 表的列进行连接。在 语义上,连接中嵌套的每级都创建一个连接表,然后用于下一连接。

在上述查询中,因为第一个外连接成为第二个外连接的运算符,所以此 查询为左嵌套外连接

下例显示右嵌套外部连接:

select stor_name, qty, date, sd.ord_num

from salesdetail sd left join (stores /*join #1 */

left join sales on stores.stor_id = sales.stor_id) /*join #2 */ on stores.stor_id = sd.stor_id

where date > "1/1/1990"

stor_name qty date ord_num

------------ ---- ------------------ -------------------- News & Brews 200 Jun 13 1990 12:00AM NB-3.142

News & Brews 250 Jun 13 1990 12:00AM NB-3.142

News & Brews 345 Jun 13 1990 12:00AM NB-3.142

. . .

Thoreau Read 1005 Mar 21 1991 12:00AM ZZ-999-ZZZ-999-0A0

Thoreau Read 2500 Mar 21 1991 12:00AM AB-123-DEF-425-1Z3

Thoreau Read 4000 Mar 21 1991 12:00AM AB-123-DEF-425-1Z3

在此示例中,第二个连接 (stores sales 表间)在逻辑上首先生成, 然后与 salesdetail 表连接。因为第二个外连接用作第一个外连接的表引 用,所以此查询为右嵌套外连接

如果第一个外连接 (“ from salesdetail. . .”)的 on 子句失败,则它向第 二个外连接的 stores sales 表提供空值。

嵌套外连接中的小括号 嵌套外部连接生成带有或不带有小括号的相同结果集。如果连接使用小 括号构建,具有多个外连接的较大查询对于用户可更加易读。


在嵌套外连接中的 on

子句

在嵌套外部连接中的 on 子句的位置确定逻辑上首先处理的连接。从左 到右读取,第一个 on 子句是要定义的第一个连接。

在以下示例中,第一个连接 (小括号中)中 on 子句的位置表示它是第二 个连接的表引用,所以它被首先定义,生成与 authors 表连接的表引用:

select title, price, au_fname, au_lname from (titles left join titleauthor

on titles.title_id = titleauthor.title_id) /*join #1*/ left join authors

on titleauthor.au_id = authors.au_id /*join #2*/ and titles.price > $15.00

title price au_fname au_lname

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

The Busy Exe... 19.99 Marjorie Green The Busy Exe... 19.99 Abrahame Bennet

. . .

Sushi, Anyon... 14.99 Burt Gringlesby Sushi, Anyon... 14.99 Akiko Yokomoto (26 rows affected)

然而,如果 on 子句在其它位置,则连接按不同序列求值,但仍然生成 相同结果集 (此示例仅具有解释性的意义;如果连接表在逻辑上按不 同顺序生成,则它可能不会生成相同结果集):

select title, price, au_fname, au_lname from titles left join

(titleauthor left join authors

on titleauthor.au_id = authors.au_id) /*join #2*/ on titles.title_id = titleauthor.title_id /*join #1*/ and au_lname like"Yokomoto"

title

price

au_fname

au_lname

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

-------

-----------

-----------


The

Busy Executive’s

19.99

Marjorie

Green

The

Busy Executive’s

19.99

Abraham

Bennet

. .

.

Sushi, Anyone?

14.99

Burt

Gringlesby

Sushi, Anyone?

14.99

Akiko

Yokomoto


(26 rows affected)

第一个连接 (查询的最后一行)的 on 子句位置表示第二个左连接是第 一个连接的表引用,所以它被首先执行。即,第二个左连接的结果与 titles 表连接。


用连接顺序依赖性转换外连接

几乎为 Adaptive Server 早期版本编写的所有 Transact-SQL 外连接,在 12.0 和更高版本的 Adaptive Server 上运行时将生成相同的结果集。然 而,有一类外连接查,其结果集取决于优化过程中选择的连接顺序。根 据查询中谓词求值的位置,使用更高版本的 Adaptive Server 发出这些查 询时,它们可生成不同的结果集。它们返回的结果集由将谓词分配给连 接的 ANSI 规则确定。

谓词引用的所有表被处理后,才能对谓词求值。即,在以下查询中,只 有在处理 titles 表后,才能对谓词 “and titles.price > 20”求值:

select title, price, au_ord from titles, titleauthor

where titles.title_id *= titleauthor.title_id and titles.price > 20

12.0 以前版本的 Adaptive Server 中的谓词根据以下语义求值:

如果谓词在外连接的内部表上被求值,则谓词具有 on 子句的语义。

如果使用表 (对于所有外连接都为外部表或不依赖于连接顺序)对 谓词求值,则谓词具有 where 子句的语义。


image

注释 在生产环境中运行 Adaptive Server 之前,请用跟踪标志 4413 启动它,并且运行您认为可能依赖于 12.0 之前的版本中连接顺序 的任何查询。当您运行依赖连接顺序的查询时,会看到类似以下的 消息:

Warning:The results of the statement on line %d are join-order independent.Results may differ on

pre-12.0 releases, where the query is potentially join-order dependent.

解决应用程序对由 12.0 之前的版本生成的连接顺序查询的结果集所 具有的依赖性。

image


一般情况下,依赖于查询的连接顺序不会发生任何问题,因为谓词通常 仅引用:

外部表,它使用 where 子句语义求值

内部表,它使用 on 子句语义求值

内部表及其所依赖的表


这些表不会生成依赖于连接顺序的外部连接。然而,具有下列任何特性 的 Transact-SQL 查询转换为 ANSI 外连接后,它们可生成不同结果集:

谓词包含 or 语句并引用外连接的内部表和不依赖于此内部表的另一 个表

引用内部表属性的谓词就是不在内部表的连接顺序依赖性中的表的 谓词

在子查询中作为相关引用来引用的内部表

下列示例演示了用连接顺序依赖性将 Transact-SQL 查询转换为 ANSI 外 连接查询的问题。

此查询不依赖于连接顺序,因为外部连接引用 titleauthor titles 表,并 且根据如下三个连接顺序使用这些表连接 authors 表:

authorstitleauthorstitles (作为 on 子句的一部分)

titleauthorsauthorstitles (作为 on 子句的一部分)

titleauthorstitlesauthors (作为 where 子句的一部分)

select title, price, authors.au_id, au_lname from titles, titleauthor, authors

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

and (titles.price is null or authors.postalcode = ’94001’)

将产生以下消息:

Warning:The results of the statement on line 1 are join-order independent.Results may differ on pre-12.0 releases, where the query is potentially join-order dependent.Use trace flag 4413 to suppress this warning message.

以下是 ANSI 等效查询:

select title, price, authors.au_id, au_lname from titles right join

(titleauthor inner join authors

on titleauthor.au_id = authors.au_id)

on titles.title_id = titleauthor.title_id

where (titles.price is null or authors.postalcode = ’94001’)

此查询依赖于连接顺序,原因与先前示例相同:

select title, au_fname, au_lname, titleauthor.au_id, price from titles, titleauthor, authors

where authors.au_id *= titleauthor.au_id and titleauthor.au_ord*titles.price > 40


以下是 ANSI 等效查询:

select title, au_fname, au_lname, titleauthor.au_id, price from titles,(authors left join titleauthor

on titleauthor.au_id = authors.au_id) where titleauthor.au_ord*titles.price > 40


Transact-SQL 外连接

Transact-SQL 包括左外连接和右外连接的语法。左外连接 *= 选择第一 个表中满足语句限制条件的所有行。如果与连接条件相匹配,第二个表 产生值。否则,第二个表产生空值。

例如,以下左外连接列出所有作者并查找其城市中的出版者 (如果有):

select au_fname, au_lname, pub_name from authors, publishers

where authors.city *= publishers.city

右外连接 =* 选择第二个表中满足语句限制条件的所有行。如果与连接 条件相匹配,第一个表产生值。否则,第一个表产生空值。


image

注释 having 子句中不能包括 Transact-SQL 外连接。

image


表是外部连接的内部成员或外部成员。如果连接运算符为 *=,则第二个 表为内部表;如果连接运算符为 =*,则第一个表为内部表。可将内部表 的某一列比作常量,并将其使用于外连接中。例如,若要查找销售超过 4000 册的 title,请使用以下命令:

select qty, title from salesdetail, titles where qty > 4000

and titles.title_id *= salesdetail.title_id

然而,外连接的内部表也无法编入常规连接子句。

先前示例使用连接来查找与出版社处于同一城市的作者姓名,返回两个 姓名:Abraham Bennet Cheryl Carson。要在结果中包括所有作者,而 不管是否与出者居住在同一城市,则使用外连接。外连接的查询和结果 如下所示:

select au_fname, au_lname, pub_name from authors, publishers

where authors.city *= publishers.city

au_fname

au_lname

pub_name

---------

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

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

Johnson

White

NULL


Marjorie

Green

NULL

Cheryl

Carson

Algodata

Infosystems

Michael

O’Leary

NULL

Dick

Straight

NULL

Meander

Smith

NULL

Abraham

Bennet

Algodata

Infosystems

Ann

Dull

NULL

Burt

Gringlesby

NULL

Chastity

Locksley

NULL

Morningstar

Greene

NULL

Reginald

Blotche-Halls

NULL

Akiko

Yokomoto

NULL

Innes

del Castillo

NULL

Michel

DeFrance

NULL

Dirk

Stringer

NULL

Stearns

MacFeather

NULL

Livia

Karsen

NULL

Sylvia

Panteley

NULL

Sheryl

Hunter

NULL

Heather

McBadden

NULL

Anne

Ringer

NULL

Albert

Ringer

NULL


(23 rows affected)

比较运算符*=使外部连接区别于普通连接。这个左外连接指示 Adaptive Server 在结果中包括 authors 表的所有行,而无论在 publishers 表中的 city 列上是否有匹配。结果显示对于列出的多数作者没有匹配数据,所以这 些行在 pub_name 列中包含 NULL

右外连接使用比较运算符 =* 指定,它表示将在结果中包括第二个表的 所有行,而不管在第一个表中是否有匹配数据。

在以前所示的外部连接中替换此运算符,得出如下结果:

select au_fname, au_lname, pub_name from authors, publishers

where authors.city =* publishers.city

au_fname

au_lname

pub_name

---------

---------

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

NULL

NULL

New Age Books

NULL

NULL

Binnet & Hardley

Cheryl

Carson

Algodata Infosystems

Abraham

Bennet

Algodata Infosystems

(4 rows affected)



stor_id title

可通过将其用作常量以进一步限制外部连接。这意味着可精确地限定要 查看的值,并使用外连接列出不包括指定值的行。首先查看等值连接, 然后将与外连接比较。例如,若要从任何商店中查找销售量超过 500 册 的书目,请使用如下查询:

select distinct salesdetail.stor_id, title from titles, salesdetail

where qty > 500

and salesdetail.title_id = titles.title_id


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

5023 Sushi, Anyone?

5023 Is Anger the Enemy? 5023 The Gourmet Microwave

5023 But Is It User Friendly? 5023 Secrets of Silicon Valley

5023 Straight Talk About Computers 5023 You Can Combat Computer Stress! 5023 Silicon Valley Gastronomic Treats

5023 Emotional Security:A New Algorithm 5023 The Busy Executive’s Database Guide

5023 Fifty Years in Buckingham Palace Kitchens 5023 Prolonged Data Deprivation:Four Case Studies

5023 Cooking with Computers:Surreptitious Balance Sheets 7067 Fifty Years in Buckingham Palace Kitchens


(14 rows affected)


stor_id title


还可使用外部连接查询来显示任何商店中销售量未超过 500 册的书目:

select distinct salesdetail.stor_id, title from titles, salesdetail

where qty > 500

and salesdetail.title_id =* titles.title_id


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

NULL Net Etiquette NULL Life Without Fear 5023 Sushi, Anyone?

5023 Is Anger the Enemy? 5023 The Gourmet Microwave

5023 But Is It User Friendly? 5023 Secrets of Silicon Valley

5023 Straight Talk About Computers


NULL The Psychology of Computer Cooking 5023 You Can Combat Computer Stress!

5023 Silicon Valley Gastronomic Treats 5023 Emotional Security:A New Algorithm 5023 The Busy Executive’s Database Guide

5023 Fifty Years in Buckingham Palace Kitchens 7067 Fifty Years in Buckingham Palace Kitchens 5023 Prolonged Data Deprivation:Four Case Studies

5023 Cooking with Computers:Surreptitious Balance Sheets NULL Computer Phobic and Non-Phobic Individuals:

Behavior Variations

NULL Onions, Leeks, and Garlic:Cooking Secrets of the Mediterranean


(19 rows affected)


可用一个简单子句限制内部表。下例列出与出版社处于同一城市的作 者,但不包括作者 Cheryl Carson,他通常作为居住在出版社所在城市的 作者列出:

select au_fname, au_lname, pub_name from authors, publishers

au_fname

au_lname

pub_name

---------

---------

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

NULL

NULL

New Age Books

NULL

NULL

Binnet & Hardley

Abraham

Bennet

Algodata Infosystems

au_fname

au_lname

pub_name

---------

---------

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

NULL

NULL

New Age Books

NULL

NULL

Binnet & Hardley

Abraham

Bennet

Algodata Infosystems

where authors.city =* publishers.city and authors.au_lname != "Carson"


(3 rows affected)


使用外连接和集合扩展列

如果同时使用外连接和集合扩展列,且如果集合扩展列来自外连接的内 部表,则它们可能导致查询的结果集等于外连接的结果集。

外连接通过使用 Sybase 外连接运算符 =* *= 来连接两个表中的列。这 些符号为 Transact-SQL 扩展语法。它们不是 ANSI SQL 符号,而“outer join”不是 Transact-SQL 中的关键字。本节仅涉及 Sybase 语法。

出于外连接的目的,星号一边所指定的列是来自外部表的外部列。

尽管集合扩展列使用集合函数 (maxmin),但它不包括在查询的 group by 子句中。


例如,若要创建结果包含空值行的外连接,请输入:

select publishers.pub_id, titles.price from publishers, titles

where publishers.pub_id *= titles.pub_id and titles.price > 20.00

pub_id price


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

0736

NULL

0877

20.95

0877

21.59

1389

22.95

(4 rows affected)

同样,若要创建结果包括空值行的外连接和集合列,请输入:

select publishers.pub_id, max(titles.price) from publishers, titles

where publishers.pub_id *= titles.pub_id and titles.price > 20.00

group by publishers.pub_id pub_id


--------------- -------- 0736 NULL

0877 21.59

1389 22.95

(3 rows affected)

若要创建带有集合扩展列的外连接和集合列 (其结果包含空值行),请 输入:

select publishers.pub_id, titles.title_id, max(titles.price)

from publishers, titles

where publishers.pub_id *= titles.pub_id and titles.price > 20.00

group by publishers.pub_id


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

....

(54 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。
+-------------------------------------华丽的分割线-------------------------------------------------------------------------