2011-03-14 53 views
0

示例表:SQL選擇所有記錄,其中獨特的複合鍵

foo bar baz gif xyz 
--- --- --- --- --- 
me my at bb cc 
me my at aa zz 
qq 33 er tt oo 
22 jj pp ww mm 

我需要返回唯一記錄的字段「富,酒吧,巴茲」一個SQL。 在這個例子中,三個四個記錄應返回:

me, my, at, bb, cc 
qq, 33, er, tt, oo 
22, jj, pp, ww, mm 
+2

什麼讓你選擇bb和cc?如果你得到aa和cc,這有什麼關係?是否有另一列例如ID或日期時間優先? – gbn 2011-03-14 19:56:20

+1

一般來說,對於SQL來說這是一個無效的任務,因爲你的第一行是含糊不清的,而你並沒有說如何確定要採用哪一行 - 以'bb,cc'或另一個以'aa,zz'結尾的行。在你的示例中,由於某種原因(順序?)選擇了'bb,cc',但是SQL在行中沒有'order',直到你指定'order by' – Snowbear 2011-03-14 19:58:22

回答

2

在沒有對GIF和XYZ的任何規則,這將採取各自的最低值

SELECT 
    foo, bar, baz, MIN(gif), MIN(xyz) 
FROM 
    MyTable 
GROUP BY 
    foo, bar, baz 
+0

這將只返回三條記錄? – bmw0128 2011-03-14 20:03:54

+1

@ bmw0128:是的,這是一個聚合 - 然而,檢查您的問題上的意見,如何選擇gif和xyz – gbn 2011-03-14 20:05:47

+0

我現在明白你的意思,我只想知道如果組合存在,所以我不在乎gif和xyz ...所以如果你的解決方案只會帶回獨特的組合值,這就是我需要的 – bmw0128 2011-03-14 20:08:54

0

不多,真的:

select * 
from myTable t1 
join (select distinct foo,bar,baz 
     from myTable 
    ) t2 on t2.foo = t1.foo 
     and t2.bar = t1.bar 
     and t2.baz = t1.baz 
+0

羞愧它不起作用。它會返回所有4行 – gbn 2011-03-14 19:58:06

1

您還沒有說過這是哪個版本的SQL .....?

在SQL Server 2005或更高,這是一個ROW_NUMBER()函數,可以讓你選擇第一

(由您提供的任何斷言訂購)查詢看起來像

SELECT 
    [foo] 
    , [bar] 
    , [baz] 
    , [gif] 
    , [xyz] 
FROM 
    (
    SELECT 
     [foo] 
     , [bar] 
     , [baz] 
     , [gif] 
     , [xyz] 
     , ROW_NUMBER() OVER (
      PARTITION BY [foo], [bar], [baz] 
      ORDER BY [gif] DESC, [xyz] DESC 
      ) 
      AS [rnk] 
    FROM 
     <TheTable> 
    ) 
WHERE 
    [rnk] = 1 

我相信在Oracle中有一個類似的函數(它們被稱爲窗口函數)。我不知道關於mysql

相關問題