Получите отличные от двух столбцов, которые обращены друг к другу в SSMS

46
5

Извиняюсь, если это дублирующий вопрос, я не могу найти его где-нибудь еще.

У меня такой стол:

column1 column2 column3
entry 1 A B
ENTRY 2 A C
ENTRY 3 B C
ENTRY 1 B A
ENTRY 2 C A
ENTRY 3 C B

В таблице, которую я использую, больше столбцов, но идея такая же.

Есть ли простой способ получить отдельные записи (т.е. я заинтересован только в возвращении Entry 1 один раз, а не дважды.

спросил(а) 2018-07-25T15:01:00+03:00 1 год, 4 месяца назад
5
Решение
71

Select distinct t1.Column1, 
case when t1.Column2 < t2.Column2 then t1.Column2 else t2.Column2 end as Column2,
case when t1.Column3 > t2.Column3 then t1.Column3 else t2.Column3 end as Column3
from myTable t1
inner join myTable t2 on t1.Column1 = t2.Column1
and t1.column2 = t2.column3;

EDIT: проще:

Select t1.* 
from myTable t1
inner join myTable t2 on t1.Column1 = t2.Column1
and t1.Column2 = t2.Column3
where t1.column2 < t1.column3

EDIT2: И если вы хотите также возвращать строки, где нет таких обманов:

Select t1.* 
from myTable t1
left join myTable t2 on t1.Column1 = t2.Column1
and t1.Column2 = t2.Column3
where t1.column2 < t1.column3 or t2.COlumn1 is null;

ответил(а) 2018-07-25T15:11:00+03:00 1 год, 4 месяца назад
Еще 4 ответа
45

Из ваших данных я предположил, что каждая запись имеет одно и то же значение column1, если они дублируются. Пытаться:

SELECT column1, column2, column3 FROM (
SELECT column1,
column2,
column3,
ROW_NUMBER() OVER (PARTITION BY column1 ORDER BY column2, column3) rn
FROM MyTable
) a WHERE rn = 1

ответил(а) 2018-07-25T15:23:00+03:00 1 год, 4 месяца назад
46

Если столбцы 2 и 3 содержат "обратные дубликаты", которые вы хотите скрыть, вам нужно будет решить, какой заказ вы хотите видеть:

SELECT column1, column2, column3
FROM aTable
WHERE column2 <= column3

ответил(а) 2018-07-25T15:11:00+03:00 1 год, 4 месяца назад
46

Вы можете использовать exists чтобы найти дубликаты, а затем < (или >), чтобы получить одну из строк;

select t.*
from t
where exists (select 1
from t t2
where t2.column1 = t1.column1 and
t2.column2 = t1.column3 and
t2.column3 = t1.column2
) and
t.column1 < t.column2;

ответил(а) 2018-07-25T15:08:00+03:00 1 год, 4 месяца назад
34

В вашем случае вы можете использовать distinct outer apply. в наружном применении вы можете добавить order by который вам нужен

select distinct
t.column1,
r.column2,
r.column3
from myTable t
outer apply (
select top 1
r.column2,
r.column3
from myTable as r
where r.column1 = t.column1
) as r

ответил(а) 2018-07-25T15:18:00+03:00 1 год, 4 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема