怎么只取join另外一张表的一行数据 ?

发布于 2022-09-02 13:18:26 字数 357 浏览 8 评论 0

简化下是这样的情形

a表
no
1
2
3

b表
no item
1 q
1 w
1 e
2 q
2 w
3 w
3 e

select a.*,b.item from a left join b on a.no = b.no

比如a.no是一张单号,b.item是物品,在b中,一个no可能有多个item,于是取出来的数据中可能有多条a.no是重复的行,但是我现在只想取得到的item的第一条,使a.no不会重复,应该怎么写?

我想取出来的结果是
1 q
2 q
3 w

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

不知在何时 2022-09-09 13:18:27

在b中,一个no可能有多个item,可以先写个group by子查询,将no,item变成一对一,如同一个no中,item取最小值

select no, min(item) from b group by no

然后用在这个子查询和a表进行关联

select a.*, c.min_item from a left join (
  select no, min(item) as min_item from b group by no  
)  c on a.no = c.no
挽梦忆笙歌 2022-09-09 13:18:27

可以使用order by

旧夏天 2022-09-09 13:18:27
SELECT a.* ,b.item FROM a , b where  a.no ='1'and b.no=(SELECT MAX(no) FROM b WHERE no = a.no)

请采纳

穿透光 2022-09-09 13:18:27
with a(no) as (

select 1 union all
select 2 union all
select 3 
),b(no,item) as (
select 1,'q' union all
select 1,'w' union all
select 1,'e' union all
select 2,'q' union all
select 2,'w' union all
select 3,'w' union all
select 3,'e' 
)
select t.no,t.item from (
select b.no,b.item,ROW_NUMBER()over(partition by b.[no] order by item) as rn from b inner join a on a.no=b.no
) t where t.rn=1

no item
1 e
2 q
3 e

上面我写的是取同一个no下item排在最前的值,如果你不想这样,你可以修改order by的条件,比如你想时间(假如有)

再比如改成partition by b.[no] order by %%physloc%%)就是按照行的物理地址顺序取最靠前的

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文