SQL选择唯一复合键所在的所有记录

时间:2011-03-14 19:53:20

标签: sql select

示例表:

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

我需要一个返回字段“foo,bar,baz”的唯一记录的SQL。 在此示例中,应返回四个记录中的三个:

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

3 个答案:

答案 0 :(得分:2)

如果没有gif和xyz的任何规则,这将采用每个

的最低值
SELECT
   foo, bar, baz, MIN(gif), MIN(xyz)
FROM
   MyTable
GROUP BY
   foo, bar, baz

答案 1 :(得分: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

答案 2 :(得分: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