不同数据库DDL的一点差别
1、DB2中,竟然没有删除列的DDL语句。办法只能是删掉数据表重建,好麻烦,特别在开发过程中,好麻烦呀!
2、Oracle的DDL不能在事务中执行。
程序中需要动态创建数据表和删除表的时候必须注意,确保不在事务中执行。
这一点上,还是SQL Server 比较好。可以在事务中执行DDL语句,可以提交,可回滚
一个Oracle、DB2、MS SQL Server都有的优化选项
Oracle、DB2、MS SQL Server都有的QueryHint,好像就只有一个了,他们在不同数据库的表现形式为:
Oracle:复制内容到剪贴板
代码:
SELECT /*+ FIRST_ROWS */ * FROM T WHERE (F1 > 5)MS SQL Server复制内容到剪贴板
代码:
SELECT * FROM T WHERE (F1 > 5) OPTION ( FAST 10)DB2 UDB复制内容到剪贴板
代码:
SELECT * FROM T WHERE (F1 > 5) OPTIMIZE FOR 1 ROWSELECT * FROM T WHERE (F1 > 5) OPTIMIZE FOR 10 ROWS注意,DB2中,单数和复数是不一样的,这是一个比较令人讨厌的特性。
我在PostgreSQL 7.4 文档中,找不到相应的优化选项,在MySQL中,应该也不会有。
不同数据库对树状数据递归查询支持
Oracle对树形数据的递归查询使用Connect子句,例如:复制内容到剪贴板
代码:
SELECT ID, PARENTID, Level
FROM TREENODE
Start With ID = 'A2'
Connect By Prior ID = ParentId在DB2和最新的MS SQL Server 2005中也支持递归查询。SQL Server 2005和DB 2语法是相似的。
如上的SQL在DB 2中应为:复制内容到剪贴板
代码:
WITH SUB_TABLE (ID, PARENTID, Level)
AS (
SELECT ID, PARENTID, 0 FROM TREENODE WHERE ID = 'A2'
UNION ALL
SELECT PRIOR_TAB.ID, PRIOR_TAB.PARENTID, KSQL_SUB_TABLE.Level + 1
FROM (SELECT ID, PARENTID, Level FROM TREENODE) PRIOR_TAB, SUB_TABLE
WHERE SUB_TABLE.ID = PRIOR_TAB.ParentId
)
SELECT ID, PARENTID, Level FROM SUB_TABLEDB2中递归查询使用起来,比Oracle的麻烦。Oracle中引入了Prior关键字,使得递归查询变得简单。
MS SQL Server在最新2005的版本中,终于支持递归查询了,相比起Oracle和DB2,落后了好多年哟