Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 удаление одинаковых гуид  [new]
El_Ninio
Member

Откуда:
Сообщений: 52
Пытаюсь удалить из таблицы совпадающих гуид, сравнивая со второй таблицей другой базе.


use db1
delete hlt_SMTAP where Date_P>'2018-09-20T00:00:00.000' and Date_P<='2018-12-07T00:00:00.000'
and SMTAPID not in (
select T1.SMTAPID from hlt_SMTAP T1 cross apply (select * from db2.dbo.hlt_SMTAP T2 where T1.SMTAPGuid=T2.SMTAPGuid and T2.rf_TariffID in 
(select T3.TariffID from d2.dbo.old_Tariff t3 inner join db1.dbo.old_Tariff t4 on T1.rf_TariffID=T4.TariffID and  T3.Value1=T4.Value1 )) X 
where T1.SMTAPGuid in (select SMTAPGuid from hlt_SMTAP group by SMTAPGuid having count(SMTAPGuid)>1 ) )  

в этом запросе удаляет даже если гуид единственный. Как сделать чтобы не удалял единственную данную. Условия вроде правильное, проверял когда в документе несколько совпадающих гуид с разными тарифами. А когда запись то удаляет тоже потому что этот единственный гуид существует второй базе, с одинаковым тарифом

Сообщение было отредактировано: 13 дек 18, 11:39
13 дек 18, 11:23    [21762635]     Ответить | Цитировать Сообщить модератору
 Re: удаление одинаковых гуид  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 6052
El_Ninio,

Воспользуйся тегом SRC и заодно отформатируй запрос до читабельного вида. Ломать глаза, выясняя почему тут id not in (.. having count(*)>1) не хочется.
13 дек 18, 11:34    [21762657]     Ответить | Цитировать Сообщить модератору
 Re: удаление одинаковых гуид  [new]
iap
Member

Откуда: Москва
Сообщений: 46983
И по дате условие, небось, такое:
Date_P>='2018-09-20T00:00:00.000' and Date_P<'2018-12-07T00:00:00.000'
13 дек 18, 11:50    [21762689]     Ответить | Цитировать Сообщить модератору
 Re: удаление одинаковых гуид  [new]
iap
Member

Откуда: Москва
Сообщений: 46983
NOT IN(SELECT ...)
лучше вообще не применять.

El_Ninio, а нельзя ли как-то причесать текст, описывающий вашу проблему?
Чтобы понять чего-нибудь было можно.
К примеру, не понял суть обращений к какой-то "второй таблице в другой базе". Зачем?
Что удалить-то надо, если по-простому, "на пальцах"?
13 дек 18, 11:55    [21762701]     Ответить | Цитировать Сообщить модератору
 Re: удаление одинаковых гуид  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20538
Обычно дубликаты удаляют по принципу

DELETE FROM table t1
WHERE NOT EXISTS (SELECT 1
                  FROM table t2
                  WHERE t1.ПолеДублирования = t2.ПолеДублирования 
                    AND t1.УникальноеПоле < t2.УникальноеПоле) -- или '>'
  AND ОстальныеУсловия
13 дек 18, 12:10    [21762734]     Ответить | Цитировать Сообщить модератору
 Re: удаление одинаковых гуид  [new]
iap
Member

Откуда: Москва
Сообщений: 46983
Akina
Обычно дубликаты удаляют по принципу

DELETE FROM table t1
WHERE NOT EXISTS (SELECT 1
                  FROM table t2
                  WHERE t1.ПолеДублирования = t2.ПолеДублирования 
                    AND t1.УникальноеПоле < t2.УникальноеПоле) -- или '>'
  AND ОстальныеУсловия
Можно приладить CTE.
Да вот, и сегодня такая тема есть: https://www.sql.ru/forum/1306651/nepravilno-udalyautsya-dubli
13 дек 18, 13:35    [21762892]     Ответить | Цитировать Сообщить модератору
 Re: удаление одинаковых гуид  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20538
iap, говоря "обычно", я имел в виду максимально общий подход - в т.ч. включая DBMS и версии, которые про CTE не слыхали...
13 дек 18, 15:27    [21763103]     Ответить | Цитировать Сообщить модератору
 Re: удаление одинаковых гуид  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4740
El_Ninio,

https://stackoverflow.com/questions/39564777/need-to-delete-duplicate-records-from-the-table-using-row-number
WITH cte AS
(
    SELECT ROW_NUMBER() OVER(PARTITION by ID ORDER BY name) AS Row
    FROM test
)

DELETE FROM cte
WHERE Row > 1
13 дек 18, 17:17    [21763263]     Ответить | Цитировать Сообщить модератору
 Re: удаление одинаковых гуид  [new]
El_Ninio
Member

Откуда:
Сообщений: 52
Удалить повторяющиеся данные это понятно, но тут условие же есть. Вообщем, есть 2 базы и у обоих есть таблица smtap .
В первой базе в некоторых документах (это другая таблица DOC) у которых в таблице SMTAP есть повторяющие данные, которые входят во второй базе, и есть не повторяющие и не входящие во второй базе данные. Данные которые входят в двух базах, они идентичны по гуиду и бывают еще документы у которые гуид идентичен в двух базаях но отличается тариф. Связать эти две таблицы в разных базах только по гуиду, потому что айди документов совсем разные.

Табл1 База1

SMTAPID DOCID SMTAPGuid TARIFF
628322 1 1 246776 0 AFD28DB0-87E9-E811-80FD-AC1F6B023FFE 0.5
628323 1 1 246776 0 AFD28DB0-87E9-E811-80FD-AC1F6B023FFE 0.5
630570 1 1 246776 0 D4591B22-88E9-E811-80FD-AC1F6B023FFE 0.3
630571 1 1 246776 0 D4591B22-88E9-E811-80FD-AC1F6B023FFE 0.3
630583 1 1 246776 0 D5591B22-88E9-E811-80FD-AC1F6B023FFE 0.14
630584 1 1 246776 0 D5591B22-88E9-E811-80FD-AC1F6B023FFE 0.14
630032 1 1 246776 0 3570E808-62D6-E811-ABE4-002590DC252E 1
605149 1 1 246776 0 4D8F3D13-4ADB-E811-A85C-002590DC252E 0.2
628972 1 1 246776 0 4D8F3D13-4ADB-E811-A85C-002590DC252E 0.2
628973 1 1 246776 0 4D8F3D13-4ADB-E811-A85C-002590DC252E 15

Табл2 База 2

199322 1 1 101 0 AFD28DB0-87E9-E811-80FD-AC1F6B023FFE 0.5
199570 1 1 101 0 D4591B22-88E9-E811-80FD-AC1F6B023FFE 0.3
203583 1 1 101 0 D5591B22-88E9-E811-80FD-AC1F6B023FFE 0.14
191972 1 1 101 0 4D8F3D13-4ADB-E811-A85C-002590DC252E 0.2


Еще такие случаи могут быть

Табл1 База1

SMTAPID DOCID SMTAPGuid TARIFF
628322 1 1 246776 0 AFD28DB0-87E9-E811-80FD-AC1F6B023FFE 7

Табл2 База 2

199322 1 1 101 0 AFD28DB0-87E9-E811-80FD-AC1F6B023FFE 0.5
199570 1 1 101 0 D4591B22-88E9-E811-80FD-AC1F6B023FFE 0.3
203583 1 1 101 0 D5591B22-88E9-E811-80FD-AC1F6B023FFE 0.14
191972 1 1 101 0 4D8F3D13-4ADB-E811-A85C-002590DC252E 0.2

в этом случае пропускает. Единственная запись должно остаться. А если две записи ну к примеру вот так.

Табл1 База1

SMTAPID DOCID SMTAPGuid TARIFF
628322 1 1 246776 0 AFD28DB0-87E9-E811-80FD-AC1F6B023FFE 7
699322 1 1 246776 0 AFD28DB0-87E9-E811-80FD-AC1F6B023FFE 0.5

Табл2 База 2

199322 1 1 101 0 AFD28DB0-87E9-E811-80FD-AC1F6B023FFE 0.5
199570 1 1 101 0 D4591B22-88E9-E811-80FD-AC1F6B023FFE 0.3
203583 1 1 101 0 D5591B22-88E9-E811-80FD-AC1F6B023FFE 0.14
191972 1 1 101 0 4D8F3D13-4ADB-E811-A85C-002590DC252E 0.2

в этом случае должна остаться вторая запись первой бд
14 дек 18, 16:04    [21764184]     Ответить | Цитировать Сообщить модератору
 Re: удаление одинаковых гуид  [new]
El_Ninio
Member

Откуда:
Сообщений: 52
С пробелами же написал, как так получилось.
14 дек 18, 16:05    [21764185]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить