#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 итак, с обновлением у вас есть решение?