如何排除在一个字段中具有重复项的行

时间:2010-07-26 20:36:09

标签: sql sql-server distinct no-duplicates

我有一个非常简单的任务,但我找不到任何解决方案。我有两个表,'文章'和'类别'

我的文章表格如下:

id | cat_id | title | content
1      1      Blah     Content 1
2      1      Blah2    Content 2
3      2      Blah3    Content 3

我的类别表如下所示:

id | title
1     Category 1
2     Category 2

您看到我有2篇文章具有相同的cat_id。我不想要重复的cat_id字段。我不能使用DISTINCT,因为我会得到所有文章,因为我想要所有的字段。

所以,如果我像这样使用DISTINCT:

SELECT DISTINCT a.id,a.cat_id,a.title,a.content FROM articles AS a

我会把所有东西都搞定,但我想要这样的输出

id | cat_id | title | content
2      1      Blah2    Content 2
3      2      Blah3    Content 3

请有人帮帮我!!!

3 个答案:

答案 0 :(得分:0)

未经测试,但应该有效:

; WITH cte AS (
   SELECT
      *
      ,ROW_NUMBER() OVER (PARTITION BY cat_id ORDER BY id DESC) AS RowNum
)
SELECT
   *
FROM cte
WHERE RowNum = 1;

答案 1 :(得分:0)

此查询将从每个类别中选择第一篇文章(最低ID)

SELECT a.* FROM Article a LEFT JOIN 
   Article a2 ON a.id<a2.id AND a.cat_id=a2.cat_id
WHERE a2.id IS NULL

它与所有其他文章进行外连接。 join子句仅连接具有相同类别且ID较小的文章。如果没有匹配项(a2.id为NULL),那么我们的文章具有该类别的最低ID。

答案 2 :(得分:0)

试试这个:

select article.*
    from article
        join (select min(id) as id, cat_id from article group by cat_id) a2
            using (id);

或:

select *
    from article
    where id in (select min(id) from article group by cat_id);

两者都为每个不同的cat_id选择一个文章ID(使用min()),并仅选择具有这些ID的记录。