如果 left join 一个自定义的函数

yzg614 2008-12-09 09:06:51
我写了一个自定义的函数
create function GetTable(@id int)
returns @returnT table (ID int,SendMode varchar(200),ExecuteUser text,TaskResult varchar(200),FinishDate varchar(200),AssessStandard varchar(200),AssessUser text,AssessCyc varchar(200),ExecuteUserID text)
begin
.....................
return
end

现在查询一个表a。想表a的数据与之想关联。select a.* from a left join dbo.GetTable(a.ID)
我这样写报错。 改怎么写呢?
谢谢
...全文
427 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
xieyueqing 2008-12-09
  • 打赏
  • 举报
回复
用apply
chuifengde 2008-12-09
  • 打赏
  • 举报
回复
对,xp_execresultset外层的select就是用来生成内层的多个id对应的insert into动态语句,而它自身一次就可以执行这些生成的语句,这点来说还是非常方便的
apple02180503 2008-12-09
  • 打赏
  • 举报
回复
select a.* from a left join dbo.GetTable(a.ID) as b on a.ID=b.ID

left join ... on ... --需要写全的。
srgcc 2008-12-09
  • 打赏
  • 举报
回复
xue xi
fcuandy 2008-12-09
  • 打赏
  • 举报
回复
xp_execresultset没有用过,倒要请教,呵呵。

你的意思是用动态语句,实际上已经生成了针对多个id产生表变量的语句了,这点开始没细看,报歉。
等不到来世 2008-12-09
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 yzg614 的回复:]
如果我想实现这样的功能 函数应该怎么改呢?
[/Quote]


create function GetTable()
returns @returnT table(...)
as
begin
--把a表所有id都一次性处理完,把得到的结果全部插入@returnT中。
end
go

--联表:
select * from a left join GetTable() b on a.xx=b.xx
chuifengde 2008-12-09
  • 打赏
  • 举报
回复
步聚2不用循环,一次可以搞定,倒是要开放扩展过程xp_execresultset的权限
fcuandy 2008-12-09
  • 打赏
  • 举报
回复
有几点问题:
1,并发问题
2,改造的代价
鸟的步聚2需要循环来执行的。


意思我是看明白了。

1,先建一个实表,结构与表变量同
2,循环源表的id,对每个id执行getTable函数,将结果插入上面建的实表
3,再连表。
chuifengde 2008-12-09
  • 打赏
  • 举报
回复

--提供一个参考方法
1.不用改:选创建一个与@return一样结构的永久表,比如test
2.再用下面的语句将函数返回的由a表id来决定的所有记录集插入表test中
DECLARE @sql VARCHAR(1000)
SET @sql='SELECT ''insert into test select * from GetTable(''+LTRIM(id)+'') x'' FROM a'
EXEC master..xp_execresultset @sql,N'库名'
3.将a表与test表left join
fcuandy 2008-12-09
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 yzg614 的回复:]
如果我想实现这样的功能 函数应该怎么改呢?
[/Quote]


关健看你函数体内部,返回的表变量是按什么逻辑生成的。

一般情况下无法改写,特殊情况还是有可能的。
Andy__Huang 2008-12-09
  • 打赏
  • 举报
回复
打错一个字了:

最简单的,先保证子查询正确,然后才能谈得上与其他表关联
Andy__Huang 2008-12-09
  • 打赏
  • 举报
回复
不要把自定义函数与关联条件直接连接,把函数返回值的结果放到子查询里,然后再用这个子查询与另外一个表关联

最简单的,无保证子查询正确,然后才能谈得上与其他表关联
yzg614 2008-12-09
  • 打赏
  • 举报
回复
如果我想实现这样的功能 函数应该怎么改呢?
super_iven 2008-12-09
  • 打赏
  • 举报
回复
函数返回的是数据表,不能这样连接的
fcuandy 2008-12-09
  • 打赏
  • 举报
回复
这是不能实现的。

sql2005中可以使用cross apply

对于inner join

左端输入和右端输入,是彼此隔离的,是不能互相引用的。



select * from ta a  --左端输入ta
inner join (select * from tb where id=a.id) /*右端输入为子查询,而子查询又引用了左端输入*/ b
on a.name=b.name

这种语句是错误的。

只可以apply

select * from ta a
cross apply
(select * from tb where id=a.id) b
where a.name=b.name

因为这个例子特殊,所以可以改写为inner join

select * from ta a
inner join tb
on a.id=b.id and a.name=b.name


而对于楼主的例子,是无法转换为内连接的写法的。

dobear_0922 2008-12-09
  • 打赏
  • 举报
回复
函数得改改,
Zoezs 2008-12-09
  • 打赏
  • 举报
回复
select a.* from a m left join (select dbo.GetTable(ID) from b) n on m.id = n.id
xjtlf 2008-12-09
  • 打赏
  • 举报
回复
mark
android2008 2008-12-09
  • 打赏
  • 举报
回复
mark
Rewiah 2008-12-09
  • 打赏
  • 举报
回复
哦,你想

select a.* from a left join dbo.GetTable(a.ID)
在参数引用a.id?

这是不能实现的,别费劲了,表值函数的参数不能引用字段



加载更多回复(8)

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧