0

如果我有一个用户表,如下所示:

UserId    Name
------    ----
1         Jim
2         Mark

和这样的订单表:

OrderId    UserId
-------    ------
1          1
2          1
3          1
4          2

我怎么能接受任何一个吉姆的订单?没关系,我只要一个。

我有这个:

加入不是问题,它只是将其限制为一个结果,因为显然有 3 个。

SELECT * FROM User u
LEFT OUTER JOIN Order o on u.UserId = o.UserId

提前致谢。

4

4 回答 4

1

这将选择第一个匹配的行:

SELECT TOP 1 * FROM User u 
LEFT OUTER JOIN Order o ON u.UserID = o.UserID

如果您提前知道要查找的用户,可以将其添加到 WHERE 子句中:

WHERE u.UserID = @userID

而且,如果您需要确保获得第一个或最近的订单,您可以使用:

ORDER BY o.OrderID ASC/DESC
于 2012-08-21T15:32:39.227 回答
0
select u.userid, 
       u.name,
       o.orderid
from users u
join (select orderid, 
             userid,
             row_number() over (partition by userid order by orderid) as rn
      from orders) o
  on o.userid = u.userid and o.rn = 1;

order by您可以通过调整窗口定义的一部分来控制正在接受哪些订单。

于 2012-08-21T15:14:55.563 回答
0

以下查询将为每个用户提供一个订单(每个用户的最低订单号)

select name, order_id 
from users u,
     orders o
where u.user_id = o.user_id 
and o.order_id = (select min(order_id) from orders c where c.user_id=o.user_id)
于 2012-08-21T15:14:01.467 回答
0
Select u.userid, name, min (orderID) 
FROM User u 
LEFT JOIN Order o on u.UserId = o.UserId     
group by u.userid, name

只为 Jim 过滤

Select min (orderID) 
FROM User u 
LEFT JOIN Order o on u.UserId = o.UserId     
where name='Jim'
于 2012-08-21T15:10:52.257 回答