从 Oracle 迁移到 SQL 服务器
Migrate from Oracle to SQL Server
我用 Oracle
编写了以下查询
delete from EQUI_HIERARCHY;
select max(level) into v_max_depth
from EQUIP_D
connect by prior EQUIP_NO=PARENT_EQUIP_NO
start with PARENT_EQUIP_NO is null;
如何转化为SQL服务器?
SQL
实现递归查询的标准方法,例如实现的IBM DB2 和 SQL Server, is the WITH clause. See this article 提供了一个将 CONNECT BY 转换为 WITH(技术上是递归 CTE)的示例——该示例适用于 DB2,但我相信它也适用于 SQL 服务器。
在 SQL Server
、IBM DB2 或 PostgreSQL 8.4 中(以及在 SQL 标准中,这是值得的;-),完全等效的解决方案是递归查询(更复杂的语法,但实际上更强大和更灵活):
WITH n(v_max_depth ) AS
(SELECT max(level)
FROM EQUIP_D
WHERE PARENT_EQUIP_NO IS NULL
UNION ALL
SELECT max(level)
FROM EQUIP_D as nplus1, n
WHERE n.EQUIP_NO= nplus1.PARENT_EQUIP_NO)
SELECT max(v_max_depth) FROM n
Oracle 的 START WITH
子句成为第一个嵌套 SELECT
,递归的基本情况,UNIONed
的递归部分只是另一个 SELECT
。
SQL 服务器的特定风格的 WITH 当然记录在 MSDN 上,其中还提供了使用此关键字的指南和限制,以及几个示例。
我用 Oracle
编写了以下查询delete from EQUI_HIERARCHY;
select max(level) into v_max_depth
from EQUIP_D
connect by prior EQUIP_NO=PARENT_EQUIP_NO
start with PARENT_EQUIP_NO is null;
如何转化为SQL服务器?
SQL
实现递归查询的标准方法,例如实现的IBM DB2 和 SQL Server, is the WITH clause. See this article 提供了一个将 CONNECT BY 转换为 WITH(技术上是递归 CTE)的示例——该示例适用于 DB2,但我相信它也适用于 SQL 服务器。
在 SQL Server
、IBM DB2 或 PostgreSQL 8.4 中(以及在 SQL 标准中,这是值得的;-),完全等效的解决方案是递归查询(更复杂的语法,但实际上更强大和更灵活):
WITH n(v_max_depth ) AS
(SELECT max(level)
FROM EQUIP_D
WHERE PARENT_EQUIP_NO IS NULL
UNION ALL
SELECT max(level)
FROM EQUIP_D as nplus1, n
WHERE n.EQUIP_NO= nplus1.PARENT_EQUIP_NO)
SELECT max(v_max_depth) FROM n
Oracle 的 START WITH
子句成为第一个嵌套 SELECT
,递归的基本情况,UNIONed
的递归部分只是另一个 SELECT
。
SQL 服务器的特定风格的 WITH 当然记录在 MSDN 上,其中还提供了使用此关键字的指南和限制,以及几个示例。