Member 7870345
Решение состоит в том, чтобы в первую очередь точно определить, где находятся "плохие регистры". Если мы видим записи (BG, CH, 280) и (CH,BG,280), то проблемы состоят в том, что они "равны", если они были вставлены всегда в оба поля в алфавитном порядке, то есть (BG, CH,280). Таким образом, запись не очень хороша на первый взгляд, если name2 является
предшествующий имени 1.
Запрос:
SELECT
CASE WHEN t1.name1<>(CASE WHEN t1.name1<t1.name2 THEN t1.name1 ELSE t1.name2 end) THEN 'bad register' else 'good registerk' end as clase
,t1.*
FROM table1 t1
говорит, что (ч, БГ, 280), (хы,ч, 350) могут неправильно зарегистрировать' (что правильно), но также говорит, что (ч,све, 500) - это неправильно зарегистрировать' (что является неправильным).
Эта последняя запись действительно не является "неправильным регистром", потому что нет "зеркального" регистра (CBE, CH, 250)
Итак, если мы используем запрос:
SELECT
CASE WHEN t1.name1<>(CASE WHEN t1.name1<t1.name2 THEN t1.name1 ELSE t1.name2 end) THEN 'wrong register' else 'ok register' end as clase
,t1.*
FROM table1 t1
JOIN table1 t2
ON t1.name1=t2.name2 AND t1.name2=t2.name1
у нас есть только настоящий "неправильный регистр" (потому что если нет регистра "мирроу" , то он говорит, что это "ок-регистр")
Затем, запрос:
SELECT t1.*
FROM table1 t1
JOIN table1 t2
ON t1.name1=t2.name2 AND t1.name2=t2.name1
WHERE t1.name1<>(CASE WHEN t1.name1<t1.name2 THEN t1.name1 ELSE t1.name2 end)
просто перечислите записи, которые вам нужно удалить.
или, проще говоря,:
SELECT t1.*
FROM table1 t1
JOIN table1 t2
ON t1.name1=t2.name2 AND t1.name2=t2.name1
WHERE t1.name1>t1.name2
Наконец то заказ:
delete TABLEdELETE
FROM table1 tableDelete
inner JOIN table1 t1
on tabledelete.name1=t1.name1 and tabledelete.name2=t1.name2
inner JOIN table1 t2
ON ( t1.name1>t1.name2 AND t1.name1=t2.name2 AND t1.name2=t2.name1 )
удаляет нужный вам регистр.
Примечание: Если ваши данные являются:
BG CH 1
CH BG 2
CH HY 2
HY CH 3
и вы не хотите, чтобы запись CH, BG, 2 была удалена, а затем использована:
delete TABLEdELETE
FROM table1 tableDelete
inner JOIN table1 t1
on tabledelete.name1=t1.name1 and tabledelete.name2=t1.name2
inner JOIN table1 t2
ON ( t1.name1>t1.name2 AND t1.name1=t2.name2 AND t1.name2=t2.name1 AND t1.distance=t2.distance )