我有一个查询,它返回一个项目列表和空白序列号字段,如下所示:
Item S/N
1
1
1
2
3
3
3
3
. . .
复制是指,因为项目的行数对应于购买的项目数。我还有一个表格,其中包含已收到序列号的项目:
Item S/N
2 416
3 72
3 319
. . .
构建第一个列表的查询不会引用带有序列号的表。 现在,我想用表中的信息修改查询结果 这样表格中的序列号就会被添加到匹配的项目中。但是,如果没有足够的序列号,我希望保留空白序列号(请注意,表中的项目将永远不会比查询更多)。新结果如下所示:
Item S/N
1
1
1
2 416
3 72
3 319
3
3
. . .
我认为左外连接会给我我想要的东西,使用我左边的查询结果(通过公共表格表达式)和我右边的表格。但是当我尝试它时,这就是我得到的:
Item S/N
1
1
1
2 416
3 72
3 72
3 72
3 72
3 319
3 319
3 319
3 319
. . .
看起来查询在匹配项目上执行交叉连接,但在没有匹配时保留左侧行基数;不是我想要的。是否有可以用来获得我想要的连接或方法?
答案 0 :(得分:0)
您可以使用row_number()
:
select t1.item, t2.s_n
from (select t1.*,
row_number() over (partition by item order by item) as seqnum
from t1
) t1 left join
(select t2.*
row_number() over (partition by item order by item) as seqnum
from t2
) t2
on t1.item = t2.item and t1.seqnum = t2.seqnum;