как исключить строки, имеющие дубликаты в одном поле - PullRequest
0 голосов
/ 27 июля 2010

У меня очень простая задача, но я не могу найти решение.У меня есть две таблицы, «статьи» и «категории»

Моя таблица статей выглядит следующим образом:

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 ИЗ статей КАК

Я выложу все, но я хочу вывод, подобный этому

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

Может кто-нибудь помочь мне, пожалуйста !!!

Ответы [ 3 ]

0 голосов
/ 27 июля 2010

Этот запрос выберет первую статью (самый низкий идентификатор) из каждой категории

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 объединяет статьи только с той же категорией и с меньшим идентификатором.Если совпадений нет (a2.id равен NULL), у нас есть статья с самым низким идентификатором для этой категории.

0 голосов
/ 27 июля 2010

Попробуйте:

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);

Оба выбирают один идентификатор статьи (используя min ()) для каждого отдельного cat_id и выбирают только записи с этими идентификаторами.

0 голосов
/ 27 июля 2010

Не проверено, но должно работать:

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