我有两张桌子如下。
id rem
1 2
2 1
id value
1 abc
1 xyz
1 mno
2 mnk
2 mjd
编辑:
#output
id value
1 abc
1 xyz
2 mnk
我想要做的是选择前2行table2,其中id为1,因为对于id 1,rem值为2,而对于id为2,则前1行为id 2,依此类推。我正在使用MS sqlserver 2012我的整个场景比这更复杂。请帮忙。
谢谢。
编辑:我知道我应该已经完成了我所做的事情以及我是如何做到的但是对于这个特殊的部分,我并不知道如何开始。我可以通过对每个唯一ID使用while循环来做到这一点,但如果可能的话,我想一次性完成。
答案 0 :(得分:1)
首先,SQL表代表无序集。除非您包含order by
。
为此目的,我会选择row_number()
:
select t2.*
from table1 t1 join
(select t2.*,
row_number() over (partition by id order by id) as seqnum
from table2 t2
) t2
on t1.id = t2.id and t2.seqnum <= t1.rem;
注意:windows子句中的order by id
应该基于您想要的行。如果您不关心哪些行,那么order by id
或order by (select null)
就可以了。
答案 1 :(得分:0)
试试这个:
DECLARE @tbl1 TABLE (id INT, rem INT)
INSERT INTO @tbl1 VALUES (1, 2), (2, 1)
DECLARE @tbl2 TABLE (id INT, value VARCHAR(10))
INSERT INTO @tbl2 VALUES (1, 'abc'), (1, 'xyz'),
(1, 'mno'), (2, 'mnk'), (2, 'mjd')
SELECT * FROM @tbl1 -- your table 1
SELECT * FROM @tbl2 -- your table 2
SELECT id,value,rem FROM ( SELECT ROW_NUMBER() OVER (PARTITION BY T.ID ORDER BY T.ID) rowid,
T.id,T.value,F.rem FROM @tbl2 T LEFT JOIN @tbl1 F ON T.id = F.id ) A WHERE rowid = 1
-- your required output
希望它有所帮助。