SQL循环和联接

时间:2019-01-30 23:00:43

标签: sql sql-server

我有一张桌子:

Vers | Rev
3    | A
7    | B
13   | C

还有第二张桌子:

Info | Version
aab  | 1
adr  | 2
bhj  | 3
bgt  | 4
nnh  | 4
ggt  | 7

我需要一张桌子:

Info | Version | Rev
aab  | 1       | A
adr  | 2       | A
bhj  | 3       | A
bgt  | 4       | B
nnh  | 4       | B
ggt  | 7       | B

如何进入决赛桌?
版本A适用于版本1-3,版本B适用于版本4-7,版本C适用于版本5-13。 如果我试图使用VB Excel做到这一点,我会在新列中添加1。然后获得第一个Vers值(3)-第二个Vers值(7),然后输出4 ....
然后,我会使用一些逻辑如果<=新列,而> = Vers编写修订版。 我不知道如何在SQL中执行此操作,我需要这样做!

4 个答案:

答案 0 :(得分:2)

尝试此操作可以通过联接表来实现

select 
t2.Info Info
,t2.Version Version
,t1.Rev Rev
from table1 t1,table2 t2
where t2.Version=t1.Vers;

答案 1 :(得分:0)

使用outer apply

select t2.*, t1.rev
from table2 t2 outer apply
     (select top (1) t1.*
      from table1 t1
      where t2.version <= t1.vers
      order by t1.vers asc
     ) t1;

相对于table1中的每个版本,这将获得table2中的“下一个”版本。

答案 2 :(得分:0)

您也可以使用子查询来做到这一点:

SELECT *
, (SELECT TOP 1 b.rev 
   FROM Table1 b 
   WHERE a.version <= b.vers 
   ORDER BY b.vers)
FROM Table2 a

答案 3 :(得分:0)

或第三个版本:

declare @t1 table(V int, R char(1))
insert @t1 values (3,'A'),(7,'B'),(13,'C')
declare @t2 table(I char(3), V int)
insert @t2 values ('aab',1),('adr',2),('bhj',3),('bgt',4),('nnh',4),('ggt',7)

select t2.*, t1.R 
from @t2 t2
join @t1 t1 on t1.V>=t2.V and not exists(select * from @t1 t3 where t3.V>=t2.v and t3.V<t1.V)