2012-06-25 168 views
1

選擇不重複的或唯一的記錄或行我要選擇我查詢數據庫不同的或唯一的記錄。我該如何做到這一點,但同時選擇整個記錄,而不是隻是我區分爲獨特的列?我必須做不速之客的加入嗎?在甲骨文

回答

3

如果你想只有一個列了幾個是唯一的,你有聯接,可能包括多條記錄,那麼你必須確定您要查詢,以提供兩個或多個值。這可以通過聚合函數來完成,與相關子查詢或派生表或熱膨脹係數(在SQL Server不知道甲骨文的)。

但是你必須確定你要你寫的查詢之前,它的價值。一旦你知道了那麼你可能知道如何得到它。

這裏有一些簡單的例子(我使用SQL Server的編碼規範,但這個最應該做的意義在Oracle中,因爲它是所有基本的SQL,Oracle可能有聲明的參數的不同方式):

select a.a_id, max (b.test) , min (c.test2) 
from tablea a 
join tableb b on a.a_id = b.a_id 
join tablec c on a.a_id = c.a_id 
group by a.a_id 
order by b.test, c.test2 

Select a.a_id, (select top 1 b.test from tableb b where a.a_id = b.a_id order by test2), 
(select top 1 b.test2 from tableb b where a.a_id = b.a_id order by test2), 
(select top 1 c.test3 from tablec c where a.a_id = c.a_id order by test4) 
from tablea a 

declare @a_id int 
set @a_id = 189 
select a.a_id , b.test, b.test4 
from tablea a 
join tableb b on a.a_id = b.a_id 
join (select min(b.b_id) from tableb b where b.a_id = @a_id order by b.test3) c on c.b_id = b.b_id 
where a.a_id = @a_id 
+0

我想整個行...我也想確保該行是唯一基於某列 – SoftwareSavant

+0

但是如果你有兩行,你如何確定哪些選擇呢? – HLGEM

+0

最後的exapmple是probaly最適合您的需要。 – HLGEM

5

根據您使用的數據庫,您可以使用窗口函數。如果你只想要行,從來沒有重複:

select t.* 
from (select t.*, 
      count(*) over (partition by <id>) as numdups 
     from t 
    ) t 
where numdups = 1 

如果你想每一行的一個例子:

select t.* 
from (select t.*, 
      row_number(*) over (partition by <id> order by <id>) as seqnum 
     from t 
    ) t 
where seqnum = 1 

如果沒有窗口的功能,你可以用做同樣的事情「不羈的加入「。

0

在第二個範例


    select t.* 
from (select t.*, 
      row_number() over (partition by id order by id) as seqnum 
     from t 
    ) t 
where seqnum = 1 

的ROW_NUMBER()必須是而不在括號星。