Фильтрация и удаление повторяющихся данных в таблице — SQL-запрос

#sql #sql-server

Вопрос:

У меня есть две таблицы в SQL, одна из которых содержит общую сумму по позиции (основная таблица), а другая содержит цену продажи и сведения о позиции по позиции (подтаблица). Надеется объединить обе таблицы вместе, но при этом возвращает только общую сумму цены, основанную на каждом продукте и его цене. Запрос удалит все повторяющиеся данные в основной таблице

Главный Стол

Подтаблица с подробностями

Результат ищет

Комментарии:

1. пожалуйста, укажите, что вы пробовали, чтобы мы могли помочь вам с реальными жизнеспособными изменениями с использованием реальных сущностей

2. удалить Мастер из мастера как подтаблицу t внутреннее соединение u на u.последовательность = t.последовательность, где t.последовательность lt;gt; u.rrank

3. Отредактируйте свой пост и добавьте в него любую запрошенную информацию. И гораздо лучше включить скрипт или скрипку, которая содержит DDL, примеры данных. и желаемые результаты на основе этих выборочных данных. Никому не нужно догадываться о вашей схеме, типах данных, которые она использует, связях (внешних ключах) между таблицами, ключах (первичных и естественных) и т. Д. И позор дизайнеру баз данных, который выбирает такие имена, как «Мастер» и «подтаблицы»!

Ответ №1:

 -- create table CREATE TABLE TEST_DB.dbo.MasterTable (  id int IDENTITY(0,1) NOT NULL,  ShipmentId int NULL,  TotalPrice bigint NULL,  CONSTRAINT MasterTable_PK PRIMARY KEY (id) );  -- insert sample data  INSERT INTO TEST_DB.dbo.MasterTable (ShipmentId, TotalPrice) VALUES(5758, 2250); INSERT INTO TEST_DB.dbo.MasterTable (ShipmentId, TotalPrice) VALUES(5758, 2250); INSERT INTO TEST_DB.dbo.MasterTable (ShipmentId, TotalPrice) VALUES(5758, 2250); INSERT INTO TEST_DB.dbo.MasterTable (ShipmentId, TotalPrice) VALUES(5758, 2250); INSERT INTO TEST_DB.dbo.MasterTable (ShipmentId, TotalPrice) VALUES(5758, 2250); INSERT INTO TEST_DB.dbo.MasterTable (ShipmentId, TotalPrice) VALUES(5758, 2250); INSERT INTO TEST_DB.dbo.MasterTable (ShipmentId, TotalPrice) VALUES(5758, 2250); INSERT INTO TEST_DB.dbo.MasterTable (ShipmentId, TotalPrice) VALUES(5758, 2250); INSERT INTO TEST_DB.dbo.MasterTable (ShipmentId, TotalPrice) VALUES(5758, 2250); INSERT INTO TEST_DB.dbo.MasterTable (ShipmentId, TotalPrice) VALUES(5758, 2250); INSERT INTO TEST_DB.dbo.MasterTable (ShipmentId, TotalPrice) VALUES(5758, 0); INSERT INTO TEST_DB.dbo.MasterTable (ShipmentId, TotalPrice) VALUES(5758, 16500); INSERT INTO TEST_DB.dbo.MasterTable (ShipmentId, TotalPrice) VALUES(5758, 16500); INSERT INTO TEST_DB.dbo.MasterTable (ShipmentId, TotalPrice) VALUES( 5758, 16500); INSERT INTO TEST_DB.dbo.MasterTable (ShipmentId, TotalPrice) VALUES(5758, 0); INSERT INTO TEST_DB.dbo.MasterTable (ShipmentId, TotalPrice) VALUES(5758, 6000); INSERT INTO TEST_DB.dbo.MasterTable (ShipmentId, TotalPrice) VALUES(5758, 6000); INSERT INTO TEST_DB.dbo.MasterTable (ShipmentId, TotalPrice) VALUES(5758, 6000); INSERT INTO TEST_DB.dbo.MasterTable (ShipmentId, TotalPrice) VALUES(5758, 0);    -- deleting all dublicates  declare  @del_count integer;   set @del_count = 1;   while @del_count gt; 0 begin    delete from TEST_DB.dbo.MasterTable   where id in   (  select min(id) from TEST_DB.dbo.MasterTable  group by ShipmentId, TotalPrice  having count(*) gt; 1  );  set @del_count = @@ROWCOUNT; end  

Ответ №2:

Для этого вы можете использовать CTE с возможностью обновления

 WITH cte AS (  SELECT *,  rn = ROW_NUMBER OVER (PARTITION BY ShipmentId, TotalPrice ORDER BY id)  FROM MasterTable ) DELETE cte WHERE rn gt; 1;  

Ответ №3:

При условии, что предоставленный вами запрос «что я пробовал» — это правильный способ определить, что нужно удалить, предположительно, первая строка равна любому последующему приращению или чему-то еще?

 delete from Master  where Id in (  select t.Id  from Master as t   inner join subtable as u   on u.sequence = t.sequence   where t.sequence lt;gt; u.rrank   and exists(select top(1) b.sequence from subtable b where b.sequence == t.sequence and rrank = t.sequence) )  

Комментарии:

1. Это близко к тому, что я получал раньше и потерпел неудачу, но в нем все еще не хватает груши из списка, которая стоит 0,00. Если вы посмотрите на изображение. на нем есть пять предметов, два уникальных предмета по цене 0,00 и 3 уникальных предмета по разным ценам i.stack.imgur.com/9GjGA.png

2. О, я предположил, что удаление было вашей проблемой, и принял ваш прямой подзапрос, обновится, ваша презумпция того, что rrnk существует, не верна, вот почему нам придется потребовать его в выражении в этом случае

3. @user17384043 итак, с обновлением у вас есть решение?