Дублированные записи для столбца - PullRequest
1 голос
/ 02 декабря 2011

Я пытаюсь получить дублированные значения в col1 для определенного значения col2.

Предположим, у меня есть эта таблица:

+----+------------+----------+
| id | col1       | col2     |
+----+------------+----------+
|  1 | 5          | 2        |
|  2 | 5          | 1        |
|  3 | 8          | 4        |
|  4 | 8          | 1        |
|  5 | 8          | 3        |
|  6 | 5          | 2        |
|  7 | 2          | 3        |
|  8 | 1          | 4        |
|  9 | 2          | 2        |
| 10 | 5          | 2        |
| 11 | 5          | 3        |
| 12 | 3          | 1        |
+----+------------+----------+

Мой запрос должен вернуть эти строки, когда col2 = 1:

+----+------------+----------+
| id | col1       | col2     |
+----+------------+----------+
|  1 | 5          | 2        |
|  6 | 5          | 2        |
| 10 | 5          | 2        |
| 11 | 5          | 3        |
|  3 | 8          | 4        |
|  5 | 8          | 3        |
+----+------------+----------+

Я пробовал этот запрос, и он довольно хорошо работает для меня:

SELECT 
DISTINCT b.* 
FROM table a,table b 
WHERE a.col1 = b.col1 AND a.col2 = 1 AND b.col2 != 1

Как видите, DISTINCT убивает огромную таблицу с записями по 100 тыс., И она ежедневно растет.

Мне нужны все значения, поэтому я не могу использовать предложение GROUP BY.

В поисках лучшего и более быстрого решения. Если будет лучше, я могу изменить всю структуру.

1 Ответ

2 голосов
/ 02 декабря 2011
SELECT a.* 
FROM table AS a 
WHERE col2 <> 1
  AND EXISTS
      ( SELECT *
        FROM table b
        WHERE b.col1 = a.col1 
          AND b.col2 = 1
      )
...