SQL-запрос для не повторяющихся записей - PullRequest
8 голосов
/ 10 сентября 2010

Я пытаюсь создать запрос, который будет возвращать все не повторяющиеся (уникальные) записи в таблице.Запрос должен использовать несколько полей, чтобы определить, являются ли записи дубликатами.

Например, если таблица имеет следующие поля;PKID, ClientID, Name, AcctNo, OrderDate, Charge. Я хотел бы использовать поля AcctNo, OrderDate и Charge для поиска уникальных записей.

Таблица

PKID-----ClientID-----Name-----AcctNo-----OrderDate-----Charge
1        JX100        John     12345      9/9/2010      $100.00
2        JX220        Mark     55567      9/9/2010       $23.00
3        JX690        Matt     89899      9/9/2010      $218.00
4        JX100        John     12345      9/9/2010      $100.00

Результатзапрос должен быть:

PKID-----ClientID-----Name-----AcctNo-----OrderDate-----Charge
2        JX220        Mark     55567      9/9/2010       $23.00
3        JX690        Matt     89899      9/9/2010      $218.00

Я пытался использовать SELECT DISTINCT, но это не работает, потому что он сохраняет одну из повторяющихся записей в результате.Я также пытался использовать HAVING COUNT = 1, но он возвращает все записи.

Спасибо за помощь.

Ответы [ 7 ]

9 голосов
/ 10 сентября 2010

HAVING COUNT(*) = 1 будет работать, если вы включите только поля в GROUP BY, которые вы используете для поиска уникальных записей. (т.е. не PKID, но вы можете использовать MAX или MIN, чтобы вернуть его, поскольку в наборе результатов будет только одна запись на группу.)

4 голосов
/ 10 сентября 2010
SELECT   MAX(PKID)     AS PKID    ,
         MAX(ClientID) AS ClientID,
         MAX(Name)     AS Name    ,
         AcctNo                   ,
         OrderDate                ,
         Charge
FROM     T
GROUP BY AcctNo   ,
         OrderDate,
         Charge
HAVING   COUNT(*) = 1

или

SELECT PKID      ,
       ClientID  ,
       Name      ,
       AcctNo    ,
       OrderDate ,
       Charge
FROM   YourTable t1
WHERE  NOT EXISTS
       (SELECT *
       FROM    YourTable t2
       WHERE   t1.PKID     <> t2.PKID
       AND     t1.AcctNo    = t2.AcctNo
       AND     t1.OrderDate = t2.OrderDate
       AND     t1.Charge    = t2.Charge
       )
3 голосов
/ 10 сентября 2010

Просто добавьте:

GROUP BY AcctNo, OrderDate, Charge
HAVING COUNT(1) = 1

GROUP BY группирует все строки с одинаковыми значениями AcctNo, OrderDate и Charge вместе, тогда HAVING COUNT(1) = 1 показывает только те строки, в которых был только 1 прародитель.

1 голос
/ 10 сентября 2010

Спасибо Кекекела за толчок в правильном направлении.

Вот запрос, который дал желаемый результат:

SELECT AcctNo, OrderDate, Charge FROM Table1 GROUP BY AcctNo, OrderDate, Charge
HAVING (COUNT(AcctNo) = 1) AND (COUNT(OrderDate) = 1) AND (COUNT(Charge) = 1);

Или более упрощенно на примере Гаса:

SELECT AcctNo, OrderDate, Charge FROM Table1 GROUP BY AcctNo, OrderDate, Charge
HAVING COUNT(1) = 1;
0 голосов
/ 21 апреля 2017
 SELECT GMPS.gen.ProductDetail.PaperType, GMPS.gen.ProductDetail.Size FROM
 GMPS.gen.ProductDetail GROUP BY GMPS.gen.ProductDetail.PaperType,
 GMPS.gen.ProductDetail.Size
 HAVING COUNT(1) = 1;
0 голосов
/ 16 мая 2013

Вы можете сначала определить неуникальные записи, а затем проверить те записи, не входящие в этот набор - например,

select * from mytable where pkid not in
(select t1.pkid 
from mytable t1 inner join mytable t2
on t1.pkid <> t2.pkid
and t1.acctno = t2.acctno
and t1.orderdate = t2.orderdate
and t1.charge = t2.charge)

последняя часть внутреннего запроса позволяет вам поиграться с критериями «равенства» - добавить необходимое количество столбцов для проверки. Конечно, это становится намного интереснее без этого первичного ключа :) В таких случаях я обычно заканчиваю тем, что создаю один

Ketil

0 голосов
/ 10 сентября 2010

Вы можете просто опустить PKID, чтобы вернуть все записи:

SELECT DISTINCT 
           ClientID
         , Name
         , AcctNo
         , OrderDate
         , Charge
FROM       table;

Примечание: Это немного отличается от того, что вы спрашиваете.
Он возвращает уникальный набор, удаляя одно неуникальное поле.
В вашем примере вы просите вернуть недубликаты.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...