У меня есть таблица MySQL, которая содержит идентификаторы, распределенные по двум столбцам:
left right
1 2
3 6
4 5
Использование SQL, как узнать, содержит ли таблица какой-либо дубликат идентификатора?
Например, пример выше в порядке, но приведенные ниже примеры не в порядке:
left right
1 2 <--+
3 6 | Not OK
4 1 <--+
left right
1 2
3 3 <-- Not OK
4 5
left right
1 2
3 6 <--+ Not OK
4 6 <--+
Мне не разрешено изменять что-либо в этой базе данных, поэтому мой вопрос заключается не в том, чтобы применять это в схеме, либо через триггеры или хранимые процедуры. Я не могу изменить схему базы данных, а скорее, как проверить, используя только операцию типа SELECT).
Если бы это был один столбец, я бы написал SELECT left FROM MyTable GROUP BY left HAVING COUNT(*) > 1;
но для двух столбцов я не уверен, как действовать...
Используйте UNION ALL
для получения всех значений слева и справа в одной колонке:
select value
from
(
select left as value from mytable
union all
select right as value from mytable
) all_values
group by value
having count(*) > 1;
если какие-либо значения слева находятся справа, то они дублируются, поэтому вы используете подзапрос и aggregate
функцию
select case when count(*)>0 then 'deplicate' else 'not' end as result from your_table
where left in (select distinct right from your_table t2)