多对多的关系数据中,如何从多得到一(第一个匹配),求sql

lianyiyong 2006-01-04 02:18:03
table :FundingSource

contractkey FundingCodeKey
----------- --------------------------------------------------
3096 155
3098 156
3098 157
3100 162
3105 165
3106 161
3101 158
3103 166
3109 169
3110 170
3110 171 *(1)
3109 171 *(1)
3109 172
3110 172
3112 173
3113 174
3112 175
3113 175
3114 178
3115 179
3102 164
3102 180

在输入contractkey(3110,3109)时得到FundingCodeKey171
在输入contractkey(3112 ,3113)时得到FundingCodeKey175
contractkey和FundingCodeKey时多对多的关系.
当输入的contractkey的值和table中的数据关系匹配时得到FundingCodeKey
...全文
208 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lianyiyong 2006-01-04
  • 打赏
  • 举报
回复
TO: libin_ftsafe(子陌红尘)
高手啊,在这么短的时间可以分析清楚题目并给出正确的答案.
CSDN的福气啊!
lianyiyong 2006-01-04
  • 打赏
  • 举报
回复
测试中
子陌红尘 2006-01-04
  • 打赏
  • 举报
回复
--生成测试数据
create table FundingSource(contractkey int,FundingCodeKey int)
insert into FundingSource select 3096,155
insert into FundingSource select 3098,156
insert into FundingSource select 3098,157
insert into FundingSource select 3100,162
insert into FundingSource select 3105,165
insert into FundingSource select 3106,161
insert into FundingSource select 3101,158
insert into FundingSource select 3103,166
insert into FundingSource select 3109,169
insert into FundingSource select 3110,170
insert into FundingSource select 3110,171
insert into FundingSource select 3109,171
insert into FundingSource select 3109,172
insert into FundingSource select 3110,172
insert into FundingSource select 3112,173
insert into FundingSource select 3113,174
insert into FundingSource select 3112,175
insert into FundingSource select 3113,175
insert into FundingSource select 3114,178
insert into FundingSource select 3115,179
insert into FundingSource select 3102,164
insert into FundingSource select 3102,180
go

--创建存储过程
create procedure sp_test(@contractkey nvarchar(100),@FundingCodeKey int output)
as
begin
declare @s nvarchar(4000)
set @s = N''
while charindex(',',@contractkey)>0
begin
set @s = @s + N' and exists(select 1 from FundingSource where FundingCodeKey=a.FundingCodeKey and contractkey='+left(@contractkey,charindex(',',@contractkey)-1)+N')'
set @contractkey = stuff(@contractkey,1,charindex(',',@contractkey),'')
end
set @s = @s + N' and exists(select 1 from FundingSource where FundingCodeKey=a.FundingCodeKey and contractkey='+@contractkey+N')'
set @s = N'select top 1 @FundingCodeKey=a.FundingCodeKey from FundingSource a where '+stuff(@s,1,5,'')
--print @s
exec sp_executesql @s,N'@FundingCodeKey int out',@FundingCodeKey out
end
go

--执行存储过程,并查看结果
declare @FundingCodeKey int
exec sp_test '3110,3109',@FundingCodeKey output
print @FundingCodeKey
--
/*
171
*/

exec sp_test '3112,3113',@FundingCodeKey output
print @FundingCodeKey
--
/*
175
*/
go

--删除测试环境
drop procedure sp_test
drop table FundingSource
go
子陌红尘 2006-01-04
  • 打赏
  • 举报
回复
create table FundingSource(contractkey int,FundingCodeKey int)
insert into FundingSource select 3096,155
insert into FundingSource select 3098,156
insert into FundingSource select 3098,157
insert into FundingSource select 3100,162
insert into FundingSource select 3105,165
insert into FundingSource select 3106,161
insert into FundingSource select 3101,158
insert into FundingSource select 3103,166
insert into FundingSource select 3109,169
insert into FundingSource select 3110,170
insert into FundingSource select 3110,171
insert into FundingSource select 3109,171
insert into FundingSource select 3109,172
insert into FundingSource select 3110,172
insert into FundingSource select 3112,173
insert into FundingSource select 3113,174
insert into FundingSource select 3112,175
insert into FundingSource select 3113,175
insert into FundingSource select 3114,178
insert into FundingSource select 3115,179
insert into FundingSource select 3102,164
insert into FundingSource select 3102,180

go


create procedure sp_test(@contractkey varchar(100))
as
begin
declare @s varchar(8000)
set @s = ''
while charindex(',',@contractkey)>0
begin
set @s = @s + ' and exists(select 1 from FundingSource where FundingCodeKey=a.FundingCodeKey and contractkey='+left(@contractkey,charindex(',',@contractkey)-1)+')'
set @contractkey = stuff(@contractkey,1,charindex(',',@contractkey),'')
end
set @s = @s + ' and exists(select 1 from FundingSource where FundingCodeKey=a.FundingCodeKey and contractkey='+@contractkey+')'
set @s = 'select top 1 a.FundingCodeKey from FundingSource a where '+stuff(@s,1,5,'')
print @s
exec(@s)
end
go

exec sp_test '3110,3109'
exec sp_test '3112,3113'

drop procedure sp_test
drop table FundingSource
lianyiyong 2006-01-04
  • 打赏
  • 举报
回复
我可能写的有问题,我输入的不是范围,而是具体的数字,使contractkey匹配
lw1a2 2006-01-04
  • 打赏
  • 举报
回复
select top 1 FundingCodeKey
from FundingSource
where contractkey between 3110 and 3109
lianyiyong 2006-01-04
  • 打赏
  • 举报
回复
to: danisluo(沙砾)
这样好像不行把,between是3110 and 3109之间的数据,
更重要的是,我输入的数据可能会是一个或者更多
lw1a2 2006-01-04
  • 打赏
  • 举报
回复
得到一个contractkey范围内FundingCodeKey最大的?
danisluo 2006-01-04
  • 打赏
  • 举报
回复
select max(FundingCodeKey)
from FundingSource
where contractkey between (3110 and 3109)

34,593

社区成员

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

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