257

我试图了解如何使用该WITH条款以及该条款的目的WITH

我所理解的是,该WITH子句是正常子查询的替代品。

谁能用一个小例子向我详细解释一下?

4

2 回答 2

326

SQL WITH 子句是 Oracle 在 Oracle 9i 第 2 版数据库中引入的。SQL WITH 子句允许您为子查询块命名(该过程也称为子查询重构),可以在主 SQL 查询中的多个位置引用该名称。分配给子查询的名称被视为内联视图或表。SQL WITH 子句基本上是普通子查询的替代品。

SQL WITH 子句的语法

以下是使用单个子查询别名时 SQL WITH 子句的语法。

WITH <alias_name> AS (sql_subquery_statement)
SELECT column_list FROM <alias_name>[,table_name]
[WHERE <join_condition>]

使用多个子查询别名时,语法如下。

WITH <alias_name_A> AS (sql_subquery_statement),
<alias_name_B> AS(sql_subquery_statement_from_alias_name_A
or sql_subquery_statement )
SELECT <column_list>
FROM <alias_name_A>, <alias_name_B> [,table_names]
[WHERE <join_condition>]

在上面的语法文档中,出现的alias_name是一个有意义的名称,您可以在 AS 子句之后为子查询指定。每个子查询都应该用逗号分隔WITH 语句示例。其余查询遵循简单和复杂 SQL SELECT 查询的标准格式。

欲了解更多信息:http ://www.brighthub.com/internet/web-development/articles/91893.aspx

于 2012-09-23T12:20:01.933 回答
111

This has been fully answered here.

See Oracle's docs on SELECT to see how subquery factoring works, and Mark's example:

WITH employee AS (SELECT * FROM Employees)
SELECT * FROM employee WHERE ID < 20
UNION ALL
SELECT * FROM employee WHERE Sex = 'M'
于 2012-09-23T12:23:26.543 回答