Проверьте дубликаты индексов, которые представляют собой комбинацию нескольких столбцов

У меня есть уникальный индекс (UQ_index1), созданный с использованием

CREATE UNIQUE INDEX UQ_index1 on product_table
(
  column1,
  column2
)
INCLUDE
(
  column3
)
WITH (DATA_COMPRESSION=PAGE)
ON scheme_Product(column1)
  1. Каким-то образом моя таблица перепуталась, и у меня есть несколько повторяющихся строк в таблице. Как могу ли я создать запрос, который поможет мне получить повторяющиеся элементы с помощью комбинация трех столбцов (столбец1, столбец2, столбец3) в product_table
  2. Каковы предлагаемые способы избавления от ситуации с дублирующимся ключом?

Остерегаться! INDEX(col2, Col1) INCLUDE(Col3) не будет иметь того же поведения, что и INDEX(col1, Col2) INCLUDE(Col3), потому что индекс BTree является своего рода вектором...

SQLpro 22.12.2020 16:24

@SQLPro Сообщение: «Повторяющееся значение ключа (val5, val6, val7)». будут ли эти значения иметь тот же порядок, что и col1, col2, col3? Я хотел просто использовать оператор select с WHERE col1= val5 AND col2 = val6, AND col3 = val7? но я не получаю такого результата для этого утверждения

SQLProfiler 22.12.2020 18:58
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
2
236
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете определить дубликаты, используя:

select p.*
from (select p.*,
             count(*) over (partition by column1, column2) as cnt
      from product_table p
     ) p
where cnt > 1
order by cnt desc, column1, column2;

Непонятно, что вы хотите сделать, чтобы избавиться от дубликатов. Если вы просто хотите удалить дубликаты, вы можете использовать delete:

with todelete as (
      select p.*,
             row_number() over (partition by column1, column2 order by column3) as seqnum
      from product_table p
     )
delete from todelete
    where seqnum > 1;

Однако у вас есть другие варианты:

  • Обновление одного из столбцов, чтобы они не дублировались.
  • Добавление еще одного столбца в уникальный индекс, чтобы обойти дубликаты.

простое добавление столбца3 выше будет работать, я думаю, чтобы получить комбинацию столбца1, столбца2, столбца3, я думаю, будет работать? Обновляя один из столбцов, я предполагаю, что вы имели в виду, что комбинация всех трех столбцов уникальна.

SQLProfiler 22.12.2020 16:23

@РахулСингх. . . Да, это то, что я имею в виду под «обновлением».

Gordon Linoff 22.12.2020 16:24

Сообщение: «Дублированное значение ключа (val5, val6, val7)». будут ли эти значения иметь тот же порядок, что и col1, col2, col3? Я хотел просто использовать оператор select с WHERE col1= val5 AND col2 = val6, AND col3 = val7? но я не получаю такого результата для этого утверждения

SQLProfiler 22.12.2020 19:01
Ответ принят как подходящий

Я думаю, что простой группы по запросу должно быть достаточно, чтобы вернуть дубликаты

SELECT column1, column2, column3
FROM product_table
GROUP BY column1, column2, column3
HAVING COUNT(*) > 1

Но я не уверен, что вы подразумеваете под дубликатами, поскольку ваш уникальный индекс не допускает дубликатов.

каким-то образом таблица перепуталась, и при копировании ее в другую резервную таблицу с теми же свойствами мы получаем, что не можем вставить повторяющуюся ошибку ключа

SQLProfiler 22.12.2020 16:34

@Oliver Сообщение: «Повторяющееся значение ключа (val5, val6, val7)». будут ли эти значения иметь тот же порядок, что и col1, col2, col3? Я хотел просто использовать оператор select с WHERE col1= val5 AND col2 = val6, AND col3 = val7? но я не получаю такого результата для этого утверждения

SQLProfiler 22.12.2020 19:02

Я не знаю, откуда приходит сообщение. Вы должны быть в состоянии сказать это по содержимому, и эти значения должны появиться в моем операторе выбора, если действительно все 3 столбца должны быть уникальными. В противном случае, если только первые 2 должны быть уникальными, удалите столбец 3 (дважды). Что я могу сказать, так это то, что если значения взяты из текстовых столбцов, они должны быть окружены '. Нравится WHERE col1= 'val5' AND col2 = 'val6', AND col3 = 'val7'

Olivier Jacot-Descombes 22.12.2020 20:06

Другие вопросы по теме