ahmed_sa Ответов: 2

Как удалить записи из таблицы trade code, которые не имеют значения родительского кода и типа родительского кода ?


Я работаю на SQL server 2012 мне нужно удалить строки которые не имеют типа родительского кода и значения родительского кода из таблицы Trade code

drop table #MappingCodeValue
drop table #TradeCode
create table #MappingCodeValue
 (
 id int identity (1,1),
 ParentCodeType  nvarchar(50),
 ParentCodeValue  nvarchar(50),
 ChildCodeType  nvarchar(50),
 ChildCodeValue  nvarchar(50)
 )
 INSERT INTO #MappingCodeValue
 (ParentCodeType,ParentCodeValue,ChildCodeType,ChildCodeValue)
 VALUES
 ('ECCS-US','AB123-US','ECCS-URB','AB123-URB'),
 ('ECCS-US','AB555-US','ECCS-URB','AB555-URB'),
 ('ECCS-US','AB666-US','ECCS-URB','AB666-URB'),
 ('ECCS-US','AB778-US','ECCS-URB','AB778-URB'),
 ('HTS-US','AB900-US','SCHEDUALB','AB900-URB')

 --select * from #MappingCodeValue
 CREATE TABLE #TradeCode
 (
 TradeCodeId int identity(1,1),
 PartId  int,
 CodeType  nvarchar(50),
 CodeValue nvarchar(50),
 PartDone  bit
 )
 insert into #TradeCode(PartId,CodeType,CodeValue,PartDone)VALUES
 (1222,'ECCS-US','AB123-US',null),
 (1255,'ECCS-US','AB555-US',null),
 (1222,'ECCS-URB','AB123-URB',1),
 (1255,'ECCS-URB','AB555-URB',1),
 (1444,'ECCS-URB','AB666-URB',1),
 (1931,'ECCS-URB','AB778-URB',1),
 (7000,'ECCS-URB','AB778-URB',1),
 (8000,'ECCS-URB','AB778-URB',1),
 (800,'SCHEDUALB','AB900-URB',1),
 (900,'SCHEDUALB','AB900-URB',1),
 (1255,'HTS-US','AB900-US',null),
 (909,'HTS-US','AB900-US',null)

3 и 4 не удаляется, потому что каждая часть есть код типа и значение кода из сопоставления
и это правильно
так что я не буду удалять
он генерируется из этих строк
('ECCS-US','AB123-US','ECCS-URB','AB123-URB'),
('ECCS-US','AB555-US','ECCS-URB','AB555-URB'),

так что часть имеет две стороны от и до так что я не буду удалять
я удалю части, которые имеют от и должны быть
так что это не есть родитель, чтобы дать мне результат
но записи или части, имеющие родителя, а также ребенка, не будут удалены
и это относится к 3 и 4



Ожидаемый результат после удаления таков

TradeCodeId	PartId	CodeType	CodeValue	PartDone
1	                1222	ECCS-US	        AB123-US	null
2	                1255	ECCS-US	        AB555-US	null
3	                1222	ECCS-URB	AB123-URB	  1
4	                1255	ECCS-URB	AB555-URB	  1
11	                1255	HTS-US	        AB900-US	null
12	                909	HTS-US	        AB900-US	null

Общий доступ к файлам и их хранение упрощены[^]

Что я уже пробовал:

;with mycte as (
 select Partid from #TradeCode t where PartDone=1
 group by Partid 
having (count(*)=1)
)

delete t 
from  #TradeCode t 
join mycte m on m.Partid=t.Partid


select * from #TradeCode

Richard Deeming

Опять же, абсолютно непонятно.

Почему записи 3 и 4 все еще находятся в вашем "ожидаемом выходе"? В нем нет никаких записей. #MappingCodeValue Где ParentCodeType и ParentCodeValue Соответствовать CodeType и CodeValue для этих записей.

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

2 Ответов

Рейтинг:
4

ahmed_sa

Я решил с помощью этого кода
--совпадение CodeValue и ParentCodeValue?

;with cte1 as(
select t.TradeCodeId ,t.PartId ,t.CodeType ,t.CodeValue ,t.PartDone ,m.ParentCodeValue  from #TradeCode t
left join #MappingCodeValue m
on t.CodeValue  =m.ParentCodeValue 
),
cte2 as(
select TradeCodeId ,PartId ,CodeType ,CodeValue ,PartDone from cte1 where PartId in(
select Partid from #TradeCode 
group by Partid 
having count(PartId)=1)
and PartDone =1
and ParentCodeValue is null
)
delete t 
from  #TradeCode t 
join cte2 m on m.Partid=t.Partid

спасибо


Рейтинг:
0

Bohdan Stupak

Извините, у меня нет рядом редактора SQL, но запрос будет выглядеть примерно так, как показано ниже

delete from #TradeCode as t
  left join #MappingCodeValue as m
  on (t.codetype = m.parentcodetype) and (t.codevalue = m.parentcodevalue)
where m.parentcodetype is null and m.parentcodevalue is null

Хитрость заключается в том, что left join позволяет выбрать те значения, которые не имеют соответствующих родительских кодов в таблице #MappingCodeValue


ahmed_sa

спасибо за ответ это не дает мне правильного результата
остальные записи № 5 и 6
как связаться
https://www.mediafire.com/view/7vjbonu46astw64/DataSheet.png/file
я делаю
удалить t из #TradeCode t
left join #MappingCodeValue as m
on (t.codetype = m.parentcodetype) и (t.codevalue = m.parentcodevalue)
где m.parentcodetype равно null, а m.parentcodevalue равно null
выберите * из #TradeCode

TradeCodeId partid не CodeType код partlevel PartDone
1 1222 ECCS-US AB123-US 0 NULL
2 1255 ECCS-US AB555-US 0 NULL
11 1255 HTS-US AB900-US 0 NULL
12 909 HTS-US AB900-US 0 NULL

ahmed_sa

Я изменяю свой первоначальный пост, если есть еще какие-то детали, которые я вам объясню