Как выбрать повторяющиеся строки с дополнительным условием sql - PullRequest
0 голосов
/ 03 февраля 2020

Я хочу выбрать все дубликаты записей, которые также соответствуют спецификациям c fix_id.

*------*-------------*---------*
|  id    time_stamp  | fix_id  |
*------*-------------*---------*
|  1   |   790       |  5679   |
|  2   |   1000      |  245679 |
|  3   |   1000      |  245679 |
|  4   |   12        |  245679 |
|  5   |   790       |  5679   |
*------*-------------*---------*

Я хочу получить идентификаторы 2 и 3, которые я пробовал с приведенным ниже кодом, но он возвращает 2,3 и 4 все записи с одинаковым fix_id

SELECT *
FROM odds
WHERE time_stamp IN (SELECT time_stamp
                  FROM odds 
                  GROUP BY time_stamp
                  HAVING COUNT(time_stamp) > 1) and fix_id='245679'

Ответы [ 2 ]

0 голосов
/ 03 февраля 2020

Я бы рекомендовал использовать not exists:

SELECT o.*
FROM odds o
WHERE EXISTS (SELECT 1
              FROM odds o2
              WHERE o2.time_stamp = o.time_stamp AND
                    o2.fix_id = o.fix_id AND
                    o2.id <> o.id
             )
WHERE a.fix_id = 245679;

Использование агрегации в подзапросе - плохая привычка, когда EXISTS или NOT EXISTS добиваются цели. Агрегация должна обрабатывать все данные, тогда как EXISTS / NOT EXISTS может остановиться на первой совпадающей записи.

0 голосов
/ 03 февраля 2020

Сделайте так:

    SELECT *
    FROM odds
    a inner join (SELECT time_stamp, fix_id
                      FROM odds 
                      GROUP BY time_stamp, fix_id
                      HAVING COUNT(*) > 1) b on a.fix_id = b.fix_id and a.time_stamp = b.time_stamp 
WHERE a.fix_id='245679'
...