2014-09-12 5 views
0

Я хочу удалить повторяющиеся строки в следующих данных.Как удалить повторяющиеся строки в SQL

данных:

a  a 
a  b 
a  c 
a  d 
a  e 
b  a 
b  b 
b  c 
b  d 
b  e 
c  a 
c  b 
c  c 
c  d 
c  e 
d  a 
d  b 
d  c 
d  d 
d  e 
e  a 
e  b 
e  c 
e  d 
e  e 

Вывод должен быть столбец1 и Столбец2 разные. , и это не должно быть следующие данные.

a  b 
a  c 
a  d 
a  e 
b  a 
b  c 
b  d 
b  e 
c  a 
c  b 
c  d 
c  e 
d  a 
d  b 
d  c 
d  e 
e  a 
e  b 
e  c 
e  d 

, так как в колонке 1 и Ь в Столбец2 такой же, как в б column1 и в Столбец2 или же просто я хочу сказать 1 + 2 так же, как 2 + 1.

Таким образом, выходной сигнал должен быть

a,b 
a,c 
a,d 
a,e 
b,c 
b,d 
b,e 
c,d 
c,e 
d,e 
+0

Добро пожаловать в Stack Переполнение: если вы отправляете код, XML или образцы данных, ** пожалуйста ** выделите эти строки в текстовом редакторе и нажмите кнопку «образцы кода» ('{}') на панели инструментов редактора, чтобы красиво отформатировать и выделить синтаксис ! –

+0

@ Nagaraju. Прочтите свой вопрос еще раз. «Это не должны быть следующие данные» упоминает a, b и b, a. «Выход должен быть« упоминается a, b. Так что это? И не называйте это «повторяющимися строками», потому что это не то, что они есть. Пожалуйста, [edit] (http://stackoverflow.com/posts/25802219/edit) –

ответ

2
select distinct least(column_1, column_2), greatest(column_1, column_2) 
from the_table 
where column_1 <> column_2; 
+0

не оставит «a, a» там? Я думаю, что должен быть «where column_1! = Column_2» –

+0

@ user2179887: да, если вы не хотите '(a, a)' в результате вам нужно исключить это через предложение 'where'. –

+0

@ a_horse_with_no_name, что делать, если я использую SQL SERVER, у которого нет функции LEAST FUNCTION? –

1

Это должно дать вам то, что вам нужно с небольшим количеством кадровых перестановок:

SELECT DISTINCT LEAST(column1, column2) as column1, GREATEST(column1, column2) as column2 
FROM myTable 

Если вы хотите сохранить значения в столбцах они принадлежали первоначально, попробуйте это:

WITH cte AS 
(SELECT t.*, ROW_NUMBER() OVER() RN 
    FROM myTable t) 
SELECT * FROM cte t 
WHERE NOT EXISTS (
    SELECT * FROM cte 
    WHERE 
     t.column1 IN (column1, column2) AND 
     t.column2 IN (column1, column2) AND 
     t.RN > RN 
) 
Смежные вопросы