2011-11-02 127 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'也可以。 –