sql 中以一个表查询另一张表

时间:2023-02-05 00:47:43
现在有两张表
 table  f1  (co1 为主键)   
id  co1 num1
 1   a   50  
 2   b   100
 3   c   71
 4   d    58
 table f2(cof2 为f1 表 co1 的外键)
id cof2 num
 1   a   20  
 2   a   50
 3   b   30
 4   b   50
 5   b   10
 6   b   20
 7   c   80
 8   c   14
 9   d   50
 10  d   3
 …  …   …
现在我要求1.以f1表中的字段为条件,当f1表中字段名a中的值50在f2表中存在现有的值则直接去f2中的值例题中的f2的id=2等相关值
2.当f1表中例字段名b的值在f2表中并不能直接取得值,当有某些字段相加会符合条件,则分别求出符合条件的字段然后取出他们的id等值,注意哦!是直接抓f2表中的符合条件的和的列值,而不是总和,而且有一点需要注意的那就是可能像题中就只有3行(3,4,6)的和符合条件但是5的字段名同为b却不可以要(不知道怎么处理)
3.当在f2表中找不到符合1,2条件的则直接显示f1所对应的字段名的值

17 个解决方案

#1


不明白说的什么意思啊!
写清楚点啊!

#2


晕了。那结果到底应该是怎样的呢?

#3


路过,貌似有点难,那个b的值不好求,除非是函数或者存储过程.

#4


复杂,帮顶.

#5


额  就是我先说下第一种情况这个我会  select  f2.id,f2.cof2,f2.num from f1 inner join f2 on f1.co1=f2.cof2  where f2.num=@num (@num 是我第一的一个游标的传递值---我想利用游标,但是好像有人提供纯select  只是我第二步做不出来! 哎 ) 

麻烦各位在帮帮忙了,谢谢啦!

#6


结果就是
要这样的格式
id  Uid   co  num
  1   2    a   50
    3    b   30
  3   4    b   50
    6    b   20
     3    c   71
     4    d   58   
红色的 是我自动用select identity(int,1,1) as  id ,……生成的一个自增id, 而最后两行是由于f1表中不能查找到符合条件的值,就还是带F1的原字段,这样描述能清楚吗?

#7


如果有N种组合符合条件怎么处理
比如还有B 40,B 70...

#8


现在我遇到的难题就是
引用 7 楼 kelph 的回复:
如果有N种组合符合条件怎么处理 
比如还有B 40,B 70...

所说的问题
哎 
我是想用存储过程配合游标来做,但是还在混乱中 ,哎 希望有看到的可以关注下

帮帮忙了!谢谢啦!

#9


类似于库存的变吧

#10


为什么这种问题都这么多跟帖..我的问题怎么没人答理!! 
http://topic.csdn.net/u/20080415/13/78dc8b89-59bb-4c4b-a921-5483cec6471a.html?seed=2044235486

#11




id  Uid   co  num 
 1   2    a   50 
 2   3    b   30 
 3   4    b   50 
 4   6    b   20 
 5   7    c   71 
 6   9    d   50  
 7  10    d   3 




应该是红色的

#12


declare  @f1 table(id int,co1 varchar(10),num1 int)
insert @f1 select
 1   ,'a',   50  union select 
 2   ,'b',   100  union select
 3   ,'c',   71  union select
 4   ,'d',    58 
declare @f2 table( id int,cof2 varchar(10),num int)
insert @f2 select
 1   ,'a',   20 union select  
 2   ,'a',   50 union select
 3   ,'b',   30 union select
 4   ,'b',   50 union select
 5   ,'b',   10 union select
 6   ,'b',   20 union select
 7   ,'c',   80 union select
 8   ,'c',   14 union select
 9   ,'d',   50 union select
 10  ,'d',   3 

select px = identity(int,1,1) ,id,cof2,num into # from @f2 order by cof2,num desc

select id,cof2,num
from(
select
    a.*,结存=(b.num1-isnull((select sum(num) from # where cof2 = a.cof2 and  px<a.px),0))
from
    # a,@f1 b 
where a.cof2 = b.co1 ) c
where c.结存 >0
drop table #

/*

id          cof2       num         
----------- ---------- ----------- 
2           a          50
4           b          50
3           b          30
6           b          20
7           c          80
9           d          50
10          d          3

(所影响的行数为 7 行)
*/

#13


declare  @f1 table(id int,co1 varchar(10),num1 int)
insert @f1 select
 1   ,'a',   50  union select 
 2   ,'b',   100  union select
 3   ,'c',   71  union select
 4   ,'d',    58 
declare @f2 table( id int,cof2 varchar(10),num int)
insert @f2 select
 1   ,'a',   20 union select  
 2   ,'a',   50 union select
 3   ,'b',   30 union select
 4   ,'b',   50 union select
 5   ,'b',   10 union select
 6   ,'b',   20 union select
 7   ,'c',   80 union select
 8   ,'c',   14 union select
 9   ,'d',   50 union select
 10  ,'d',   3 

select px = identity(int,1,1) ,id,cof2,num into # from @f2 order by cof2,num desc

select id,cof2,case when num>num1 then num1 else num end as num
from(
select
    a.*,b.num1,结存=(b.num1-isnull((select sum(num) from # where cof2 = a.cof2 and  px<a.px),0))
from
    # a,@f1 b 
where a.cof2 = b.co1 ) c
where c.结存 >0
drop table #

/*

id          cof2       num         
----------- ---------- ----------- 
2           a          50
4           b          50
3           b          30
6           b          20
7           c          71
9           d          50
10          d          3

(所影响的行数为 7 行)
*/

#14


/*

id          cof2       num         
----------- ---------- ----------- 
2           a          50
4           b          50
3           b          30
6           b          20
7           c          71
9           d          50
10          d          3
  --f1表中可是58  ,应该扣不完的呀
(所影响的行数为 7 行)
*/

#15


谢谢各位的关注

还有“无枪狙击手“同时谢谢你给我提供了一个思路

我会尝试看看

虽然又发现新问题!希望可以解决!

希望有想到好方法的可以在帮帮忙!谢拉!

#16


不知,帮顶

#17


该回复于2008-11-05 13:44:32被版主删除

#1


不明白说的什么意思啊!
写清楚点啊!

#2


晕了。那结果到底应该是怎样的呢?

#3


路过,貌似有点难,那个b的值不好求,除非是函数或者存储过程.

#4


复杂,帮顶.

#5


额  就是我先说下第一种情况这个我会  select  f2.id,f2.cof2,f2.num from f1 inner join f2 on f1.co1=f2.cof2  where f2.num=@num (@num 是我第一的一个游标的传递值---我想利用游标,但是好像有人提供纯select  只是我第二步做不出来! 哎 ) 

麻烦各位在帮帮忙了,谢谢啦!

#6


结果就是
要这样的格式
id  Uid   co  num
  1   2    a   50
    3    b   30
  3   4    b   50
    6    b   20
     3    c   71
     4    d   58   
红色的 是我自动用select identity(int,1,1) as  id ,……生成的一个自增id, 而最后两行是由于f1表中不能查找到符合条件的值,就还是带F1的原字段,这样描述能清楚吗?

#7


如果有N种组合符合条件怎么处理
比如还有B 40,B 70...

#8


现在我遇到的难题就是
引用 7 楼 kelph 的回复:
如果有N种组合符合条件怎么处理 
比如还有B 40,B 70...

所说的问题
哎 
我是想用存储过程配合游标来做,但是还在混乱中 ,哎 希望有看到的可以关注下

帮帮忙了!谢谢啦!

#9


类似于库存的变吧

#10


为什么这种问题都这么多跟帖..我的问题怎么没人答理!! 
http://topic.csdn.net/u/20080415/13/78dc8b89-59bb-4c4b-a921-5483cec6471a.html?seed=2044235486

#11




id  Uid   co  num 
 1   2    a   50 
 2   3    b   30 
 3   4    b   50 
 4   6    b   20 
 5   7    c   71 
 6   9    d   50  
 7  10    d   3 




应该是红色的

#12


declare  @f1 table(id int,co1 varchar(10),num1 int)
insert @f1 select
 1   ,'a',   50  union select 
 2   ,'b',   100  union select
 3   ,'c',   71  union select
 4   ,'d',    58 
declare @f2 table( id int,cof2 varchar(10),num int)
insert @f2 select
 1   ,'a',   20 union select  
 2   ,'a',   50 union select
 3   ,'b',   30 union select
 4   ,'b',   50 union select
 5   ,'b',   10 union select
 6   ,'b',   20 union select
 7   ,'c',   80 union select
 8   ,'c',   14 union select
 9   ,'d',   50 union select
 10  ,'d',   3 

select px = identity(int,1,1) ,id,cof2,num into # from @f2 order by cof2,num desc

select id,cof2,num
from(
select
    a.*,结存=(b.num1-isnull((select sum(num) from # where cof2 = a.cof2 and  px<a.px),0))
from
    # a,@f1 b 
where a.cof2 = b.co1 ) c
where c.结存 >0
drop table #

/*

id          cof2       num         
----------- ---------- ----------- 
2           a          50
4           b          50
3           b          30
6           b          20
7           c          80
9           d          50
10          d          3

(所影响的行数为 7 行)
*/

#13


declare  @f1 table(id int,co1 varchar(10),num1 int)
insert @f1 select
 1   ,'a',   50  union select 
 2   ,'b',   100  union select
 3   ,'c',   71  union select
 4   ,'d',    58 
declare @f2 table( id int,cof2 varchar(10),num int)
insert @f2 select
 1   ,'a',   20 union select  
 2   ,'a',   50 union select
 3   ,'b',   30 union select
 4   ,'b',   50 union select
 5   ,'b',   10 union select
 6   ,'b',   20 union select
 7   ,'c',   80 union select
 8   ,'c',   14 union select
 9   ,'d',   50 union select
 10  ,'d',   3 

select px = identity(int,1,1) ,id,cof2,num into # from @f2 order by cof2,num desc

select id,cof2,case when num>num1 then num1 else num end as num
from(
select
    a.*,b.num1,结存=(b.num1-isnull((select sum(num) from # where cof2 = a.cof2 and  px<a.px),0))
from
    # a,@f1 b 
where a.cof2 = b.co1 ) c
where c.结存 >0
drop table #

/*

id          cof2       num         
----------- ---------- ----------- 
2           a          50
4           b          50
3           b          30
6           b          20
7           c          71
9           d          50
10          d          3

(所影响的行数为 7 行)
*/

#14


/*

id          cof2       num         
----------- ---------- ----------- 
2           a          50
4           b          50
3           b          30
6           b          20
7           c          71
9           d          50
10          d          3
  --f1表中可是58  ,应该扣不完的呀
(所影响的行数为 7 行)
*/

#15


谢谢各位的关注

还有“无枪狙击手“同时谢谢你给我提供了一个思路

我会尝试看看

虽然又发现新问题!希望可以解决!

希望有想到好方法的可以在帮帮忙!谢拉!

#16


不知,帮顶

#17


该回复于2008-11-05 13:44:32被版主删除