日期:2014-05-17  浏览次数:20894 次

求一条简单去重复的sql语句
有两个表,结构分别如下:
orders(order_id,order_name)
数据为:
1,订单1
order_product(product_id,product_name,order_id)
1,产品1,1
2,产品2,2

orders表与order_product表是一对多的关系

现在我要查找记录:
select o.order_id,p.product_name from orders o left join order_product p on o.order_id=p.order_id
这样将会得到两条记录
1,产品1
1,产品2

但现在我业务要求,不管订单对应几个产品,只显示第一个产品信息,要求得到的记录如下:
1,产品1

请问这条语句怎么写????????????????

我尝试用:
select distinct(o.order_id),p.product_name from orders o left join order_product p on o.order_id=p.order_id
得到的还是两条记录

select distinct(o.order_id from orders o left join order_product p on o.order_id=p.order_id
这样得到的就是一条记录,但我一定要列出产品名称,所以这种方式也不行

------解决方案--------------------
SQL code
select o.order_id,p.product_name,row_number()over(partition by o.order_id order by p.product_id)
from orders o,order_product p
where o.order_id = p.order_id

------解决方案--------------------
WITH orders AS(
SELECT '1' order_id ,'订单1' order_name
FROM dual
UNION ALL
SELECT '2' order_id ,'订单2' order_name
FROM dual
) ,
 order_product AS(
SELECT 
'1'product_id ,'产品1' product_name,'1'order_id FROM dual
UNION ALL
SELECT '2' ,'产品2','2' FROM dual
UNION ALL
SELECT '2' ,'产品2','1' FROM dual
UNION ALL
SELECT '1' ,'产品1','2' FROM dual
)
SELECT order_id,product_name
FROM(
SELECT orders.order_id, order_product.product_name, rank() over(PARTITION BY orders.order_id ORDER BY orders.order_id,order_product.product_id ) rn_
FROM order_product, orders
WHERE orders.order_id = order_product.order_id) a
WHERE a.rn_ = 1

第二个sql语句思想和这个一样,稍微改一下即可!