新足迹

 找回密码
 注册

精华好帖回顾

· 我身边的美女或曾在我身边的美女-表姐 (2010-1-18) gingerzjy · 咋办呢? 80多岁的父母养老问题? 天堂里的父亲,希望一切安好!! 08.06.2017 (close forever)) (2017-1-25) wunaidesixu
· 煮夫手记十一 四年钻研 一朝奉献 葱油饼的两做与两吃 试验成功的童鞋名单汇总在72楼! (2011-1-4) amon54 · Croydon with Clarendon 建房之路(最新更新入住一年后DIY前院&侧院LANDSCAPING进展) (2009-12-21) hunterxiao911
Advertisement
Advertisement
查看: 1701|回复: 20

T-SQL 问题求助 [复制链接]

发表于 2012-5-23 15:17 |显示全部楼层
此文章由 zombie 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 zombie 所有!转贴必须注明作者、出处和本声明,并保持内容完整
有个query1,
SELECT a,b,c FROM table1,

有个UDF: func1(par1, par2), 返回一个只有一行的表: d,e,f。 func1要作用在query1的每一行结果上,用a,b做参数,产生相应的d,e,f
再返回一个结果a,b,c,d,e,f

比如
table1
a    b   c
1    1   1
2    2   2
3    3   3

func1(par1,par2)
return table(par1*2, par2*3, par1+par2)

想要的结果是
a   b    c   d   e   f
1   1    1   2   3   2
2   2    2   4   6   4
3   3    3   6   9   6

该怎么做?
Advertisement
Advertisement

退役斑竹

发表于 2012-5-23 15:32 |显示全部楼层
此文章由 月亮 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 月亮 所有!转贴必须注明作者、出处和本声明,并保持内容完整
直接 SELECT a,b,a*2,b*3, (a+b) FROM table1

发表于 2012-5-23 15:38 |显示全部楼层
此文章由 jameshu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 jameshu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
版主居然会SQL,厉害啊!

发表于 2012-5-23 15:40 |显示全部楼层

回复 月亮 2# 帖子

此文章由 zombie 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 zombie 所有!转贴必须注明作者、出处和本声明,并保持内容完整
这里的func1只是个例子,实际复杂一点,要根据a,b的值从不同的表读取。
我其实也在用类似月亮的方法,将func1的逻辑拷到每一个附加的colmuns上,但是看起来挺笨,有没有好方法呢,最好能不用再另外写一个UDF。

[ 本帖最后由 zombie 于 2012-5-23 14:53 编辑 ]

发表于 2012-5-23 16:53 |显示全部楼层
此文章由 IsDonIsGood 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 IsDonIsGood 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 jameshu 于 2012-5-23 14:38 发表
版主居然会SQL,厉害啊!

DBA不会SQL,您在说笑吧

发表于 2012-5-23 16:59 |显示全部楼层
此文章由 典 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 典 所有!转贴必须注明作者、出处和本声明,并保持内容完整
APPLY
Advertisement
Advertisement

发表于 2012-5-23 17:00 |显示全部楼层
此文章由 北风 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 北风 所有!转贴必须注明作者、出处和本声明,并保持内容完整
不要用udf

发表于 2012-5-23 17:05 |显示全部楼层
此文章由 benny2002 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 benny2002 所有!转贴必须注明作者、出处和本声明,并保持内容完整
you can use VIEW

发表于 2012-5-23 17:09 |显示全部楼层
此文章由 典 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 典 所有!转贴必须注明作者、出处和本声明,并保持内容完整
SELECT a,b,c FROM table1
cross apply func1(a,b)
---------------------
func1(a,b)
returns table (e,f,g)
----------------------
result should be

a,b,c,e,f,g
a,b,c,e,f,g
a,b,c,e,f,g

评分

参与人数 1积分 +3 收起 理由
bffbffbff + 3 我很赞同

查看全部评分

发表于 2012-5-23 17:10 |显示全部楼层

回复 典 6# 帖子

此文章由 zombie 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 zombie 所有!转贴必须注明作者、出处和本声明,并保持内容完整
谢谢你。
用OUTER APPLY
select a,b,c from X
outer apply func1(a,b)
学习了。
这个outer apply只有sql server 有吧?

发表于 2012-5-23 17:10 |显示全部楼层

回复 典 9# 帖子

此文章由 zombie 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 zombie 所有!转贴必须注明作者、出处和本声明,并保持内容完整
对的对的,谢谢。
Advertisement
Advertisement

参与宝库编辑功臣

发表于 2012-5-23 17:11 |显示全部楼层
此文章由 bffbffbff 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 bffbffbff 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 zombie 于 2012-5-23 14:40 发表
这里的func1只是个例子,实际复杂一点,要根据a,b的值从不同的表读取。
我其实也在用类似月亮的方法,将func1的逻辑拷到每一个附加的colmuns上,但是看起来挺笨,有没有好方法呢,最好能不用再另外写一个UDF。


感觉说的还是不太清楚,最好具体点数据和例子,目前看你说的情况似乎可以采用ls典说的apply,
永远的junior programmer

发表于 2012-5-23 17:11 |显示全部楼层

回复 北风 7# 帖子

此文章由 zombie 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 zombie 所有!转贴必须注明作者、出处和本声明,并保持内容完整
你是指把func1的逻辑直接加到查询中吗?请详细指教。

参与宝库编辑功臣

发表于 2012-5-23 17:11 |显示全部楼层
此文章由 bffbffbff 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 bffbffbff 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 zombie 于 2012-5-23 16:10 发表
谢谢你。
用OUTER APPLY
select a,b,c from X
outer apply func1(a,b)
学习了。
这个outer apply只有sql server 有吧?


研究下cross apply和outer apply的区别,一个类似inner join,一个类似于left join
永远的junior programmer

发表于 2012-5-23 17:12 |显示全部楼层

回复 benny2002 8# 帖子

此文章由 zombie 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 zombie 所有!转贴必须注明作者、出处和本声明,并保持内容完整
能详细点吗?

发表于 2012-5-23 17:14 |显示全部楼层
此文章由 北风 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 北风 所有!转贴必须注明作者、出处和本声明,并保持内容完整
根据你的描述,个人觉得,2楼的是最好的方法
数据层里解决不太复杂的逻辑计算,真正非常复杂的逻辑到上一层去解决吧

原帖由 zombie 于 23/5/2012 16:11 发表
你是指把func1的逻辑直接加到查询中吗?请详细指教。
If you let people believe that you are weak, sooner or later you’re going to have to kill them.
Advertisement
Advertisement

发表于 2012-5-23 17:50 |显示全部楼层
此文章由 zombie 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 zombie 所有!转贴必须注明作者、出处和本声明,并保持内容完整
回LS各位,
具体如下。
X(a,b,c)
Y1,2,3 (prikey-col, ref-col, dval, eval)
Z1,2,3(prikey, fval)
func1(a,b,c),--
return (d,e,f)
(d,e) --
   if a=TY1/2/3, query table Y1/2/3,
      if b is not null, use condition Y.prikey-col=b
     else use condition Y.ref-col=c and return any one row
   (f) –
  If a=TY1/2/3 query table Z1,2,3 use Z.prikey=c
EXample:
X
a             b       c
'TY1'       1       2
'TY1'       null   2

Y1
Prikey-col   refcol   d        e      
1                    2       33     44   
2                    2      66      77   

Z1
Prikey      fval

1        555
2        666

returned should be
a             b       c                d                       e                   f
'TY1'       1       2               33                    44               666
'TY1'       null   2              33or66            44or77       666

发表于 2012-5-23 19:54 |显示全部楼层

回复 zombie 10# 帖子

此文章由 典 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 典 所有!转贴必须注明作者、出处和本声明,并保持内容完整
这个outer apply只有sql server 有吧?
----
我猜其它数据库应该也有
在一些编程语言比如javascript里也用apply
头像被屏蔽

禁止访问

发表于 2012-5-23 20:26 |显示全部楼层

难道不用 CASE WHEN

此文章由 atransformer 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 atransformer 所有!转贴必须注明作者、出处和本声明,并保持内容完整

发表于 2012-5-25 09:23 |显示全部楼层
此文章由 zombie 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 zombie 所有!转贴必须注明作者、出处和本声明,并保持内容完整
比较一下,好像APPLY好用些。
谢谢大家,可惜级别太低,加不了分。

发表于 2012-5-27 23:34 |显示全部楼层
此文章由 frankren 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 frankren 所有!转贴必须注明作者、出处和本声明,并保持内容完整
很少用到APPLY
Advertisement
Advertisement

发表回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Advertisement
Advertisement
返回顶部