DB Oracle SqlServer 兼容问题(随项目持续更新3)

Oracle SqlServer  同时支持,挺费劲的,问题(日期与临时表兼容,Tree 型数据所有父节点,子节点处理

1.    select
        count(*)
    from
        (select
            *
        from
            transaction_history
        union
        select
            *
        from
            transaction
    )  --无别名(Oracle)
where
    to_char(createdate,'yyyy-MM-dd')<='2012-01-06'
    and  to_char(createdate,'yyyy-MM-dd')>='2011-12-27' 
    and stockcode='000016'

但是SqlServer 不行,必须对临时表别名

select
        count(*)
    from
        (select
            *
        from
            transaction_history
        union
        select
            *
        from
            transaction
    )  _temp--有别名(SqlServer)
where
  convert(varchar(10), createdate, 20) <='2012-01-06'
    and  convert(varchar(10), createdate, 20) >='2011-12-27' 
    and stockcode='000016'

2.SQL 获取所有父节点

Sql_server fn:


CREATE FUNCTION f_getAllParent(@SID varchar(200))
RETURNS @t_Level TABLE(SID varchar(200),name varchar(100),Level int)
AS
BEGIN
    declare @name varchar(100) 
    DECLARE @Level int
    SET @Level=1
    select @name=name from SYS_UNIT where sid=@sid
    INSERT @t_Level SELECT @SID,@name,@Level
    WHILE @@ROWCOUNT>0
    BEGIN
        SET @Level=@Level+1
        INSERT @t_Level
    SELECT a.parentsid,a.name,@Level
    FROM SYS_UNIT a,@t_Level b
    WHERE a.sid=b.sid
     AND b.Level=@Level-1
    END
    RETURN
END
GO

测试代码:

select a.sid  from SYS_UNIT a , f_getAllParent('dc=com') b where a.sid = b.sid order by b.Level

 

Oracle suppoet key word:

 SELECT SID FROM SYS_UNIT

 CONNECT BY PRIOR parentsid=sid  --(prior 后跟的是父节点,则以 START WITH SID='dc=com'
指定的特定子节点作为当前子节点往上遍历所有父节点)
 START WITH SID='dc=com'

 

3.获取所有子节点:

Sql_server fn:

create function f_GetAllChild(@sid varchar(200))
returns @re table(sid varchar(200),name varchar(100),level int) 
as 
begin
  declare @name varchar(100) 
  declare @level int 
  set @level=1 
  select @name=name from SYS_UNIT where sid=@sid
  insert @re select @sid,@name,@level 
  while @@rowcount>0 
  begin 
  set @level=@level+1 
  insert @re select a.sid,a.name,@level 
  from SYS_UNIT a,@re b 
  where a.parentsid=b.sid and b.level=@level-1 
  end 
  return 
end
go

select a.sid,b.level  from SYS_UNIT a , f_GetAllChildRole('dc=com') b where a.sid = b.sid order by b.Level

 

Oracle suppoet key word:

 

 SELECT SID FROM SYS_UNIT

 CONNECT BY PRIOR sid=parentsid  --(prior 后跟的是子节点,则以 START WITH SID='dc=com'
指定的特定子节点作为当前根节点往下遍历所有子节点)
 START WITH SID='dc=com'

 

Oracle注意区分Prior 后遍历的方向

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值