При соединении таблицы с самой собой для определения повторяющейся даты в столбце, как вы удерживаете ее от возврата инверсии в результатах? - PullRequest
2 голосов
/ 31 июля 2011

Я пытаюсь написать заявление SQL, чтобы вернуть мне список дубликатов, которые я нахожу в таблице. Для простоты представьте таблицу с именем TEST со столбцом rowid и текстовым столбцом с именем column 1 со следующей датой:

rowid | column1
---------------
  1   |   A
  2   |   B
  3   |   C
  4   |   A
  5   |   B
  6   |   C
  7   |   D

У меня есть запрос:

select t1.rowid, t1.column1, t2.rowid, t2.column1
from test t1
inner join test t2 on t1.column1 = t2.column1 and t1.rowid <> t2.rowid

Это дает мне следующие результаты, как я и ожидал:

rowid | column1 | rowid | column1
---------------------------------
  1   |   A     |   4   |   A
  2   |   B     |   5   |   B
  3   |   C     |   6   |   C
  4   |   A     |   1   |   A
  5   |   B     |   2   |   B
  6   |   C     |   3   |   C

То, что я действительно хочу, это просто:

rowid | column1 | rowid | column1
---------------------------------
  1   |   A     |   4   |   A
  2   |   B     |   5   |   B
  3   |   C     |   6   |   C

Какую черную магию sql мне нужно вызвать, чтобы получить желаемый результат?

Ответы [ 3 ]

9 голосов
/ 31 июля 2011
select t1.rowid, t1.column1, t2.rowid, t2.column1
from test t1
inner join test t2 on t1.column1 = t2.column1 and t1.rowid < t2.rowid
0 голосов
/ 31 июля 2011

Вы пробовали это?

select min(rowid), column1, max(rowid), column1 
from test
group by column1
having count(*)>1

Сохраняет выполнение самостоятельных объединений или подзапросов, должно быть быстрее.

0 голосов
/ 31 июля 2011

Другой подход для получения результатов в той же форме, что и исходная таблица:

SELECT t.rowid, t.column1
    FROM (SELECT column1
              FROM test 
              GROUP BY column1
              HAVING COUNT(*) > 1) q
        INNER JOIN test t
            ON q.column1 = t.column1
    ORDER BY t.column1, t.rowid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...