2011-11-02 93 views
0

已搜索hi and low,似乎无法找到如何做到这一点。我有一个两列的表。只选一条记录

Order route 
===== ===== 
Order_1 100 
Order_1 101 
Order_2 102 
Order_3 103 
Order_4 104 

我想要的结果是,提前

Order_2 102 
Order_3 103 
Order_4 104 

感谢。

+1

请告诉我们你已经尝试过了。 – NickLH

+0

SQL? C#?有点难以告诉你在这里之后... – kaveman

+0

对不起,我很匆忙地在平板电脑上输入它。感谢您的修复。这是一个使用ODP.NET的C#sql字符串。香农的答案效果很好。太感谢了。真棒网站。 – ValiRossi

回答

4

Order是保留关键字,所以我用order_column代替。

首先,测试数据:

create table order_route_table(order_column varchar2(20) 
    , route number); 

insert into order_route_table 
select 'Order_1', 100 from dual 
union all select 'Order_1', 101 from dual 
union all select 'Order_2', 102 from dual 
union all select 'Order_3', 103 from dual 
union all select 'Order_4', 104 from dual; 

然后传统上:

select order_column, min(route) 
from order_route_table 
group by order_column 
having count(*) = 1; 

与分析:

select order_column, route 
from (select order_column 
     , route 
     , count(*) over (partition by order_column) as order_count 
    from order_route_table) 
where order_count = 1; 

结果在任一种情况下:

ORDER_COLUMN    ROUTE 
-------------------- ---------- 
Order_2      102 
Order_3      103 
Order_4      104 
+0

谢谢,我实际上并没有使用名字命令。我很感激帮助。 – ValiRossi

+0

min函数在这种情况下做什么? – ValiRossi

+0

在'select'子句中使用'group by'列时,必须在group by中或在聚合函数内部使用。您不希望路由在'group by'中,因为这会导致这两个Order_1行位于不同的组中并显示。所以'min'获得该组的最小路线。每个组只有一个基础行,因为'count(*)= 1',所以'min'为我们提供了这条路线。 'Max'也可以。 –