Проверьте наличие разных значений подряд - sql

0

Учитывая таблицу со столбцами (col1, col2, col3, col4,....), как мы запрашиваем таблицу так, чтобы она возвращала только строки, где определенное подмножество столбцов, например (col2, col4, col5), значения отличаются друг от друга.

Например, для этой таблицы (эта таблица создается после выполнения нескольких кросс-соединений и запросов), определите поднабор столбцов как (t1_id, t2_id, t3_id):

Изображение 174551

Затем запрос должен вернуть это:

Изображение 174551

Подмножество столбцов будет переменной и может быть очень большим, поэтому используйте sth, например where t1.id<>t2.id and t1.id<>t3.id and t2.id<>t3.id не будет удобным подходом,

  • 0
    Мы можем и должны отклонить предпосылку вопроса. В нормализованной среде - среде, в которой процветает СУРБД - такая ситуация не возникнет
  • 0
    @Strawberry поле id не является первичным ключом, поэтому такая ситуация может существовать и существует. Я думаю, что я использовал плохое имя здесь.
Показать ещё 4 комментария
Теги:
mariadb

2 ответа

2

Простым решением может быть использование критериев NOT IN для столбцов N-1.
Который может быть сокращен для каждого дополнительного NOT IN.

Например, если имеется 5 столбцов:

WHERE t1.id NOT IN (t5.id, t4.id, t3.id, t2.id)
  AND t2.id NOT IN (t5.id, t4.id, t3.id)
  AND t3.id NOT IN (t5.id, t4.id)
  AND t4.id <> t5.id

Другой метод заключается в конкатенировании id и последующем использовании регулярного выражения.

-- test table with numbers 
create table test (id int primary key);
insert into test values (1),(2),(3),(4),(5);

-- cross joining the numbers and only get those with unique number combinations 
select t1.id as id1, t2.id as id2, t3.id as id3, t4.id as id4, t5.id as id5
from test t1 
cross join test t2 
cross join test t3 
cross join test t4
cross join test t5
where concat_ws(' ',t1.id,t2.id,t3.id,t4.id,t5.id) not rlike '\\b(\\d+)\\b.*\\b\\1\\b';

Протестировано на dbfiddle для MariaDb 10.2

  • 0
    Я получил эту идею из вашего предыдущего ответа, однако мне было интересно, если есть более общий подход. Поскольку я буду делать это с переменным входом столбцов, поэтому допустим, что подмножество столбцов может находиться между [2, n], мне нужно сгенерировать (n-1) таких предложений if, и в каждом предложении есть аналогичные «где» пункты. Слишком много беспорядка, я думаю.
  • 0
    Насколько большим это может быть N? Если это для тех перекрестных объединений в вашем предыдущем вопросе? Как вы думаете, сколько перекрестных объединений возможно, пока база данных не захлебнется? Кстати, вы ищете стандартное решение ANSI SQL или просто Oracle?
Показать ещё 10 комментариев
0

not in моем понимании смысл для меня.

Однако MariaDB поддерживает регулярные выражения PCRE. И они поддерживают обратные ссылки. Поэтому вы можете использовать их для поиска дубликатов:

where concat(',', concat_ws(',', t1.id, t2.id, t3.id), ',') not regexp '([^,]+).*,\1,'

Обратите внимание, что вам, возможно, придется удвоить обратную косую черту, потому что это часто символ escape.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню