2016-03-11 76 views
0

我有一个查询返回的以下数据: -删除行如果表中存在的其他数据

CUSTACCOUNT  DIVISION  EXTPERSON SALESMAN 
C0001729   ECD  5637263283 Ian 
C0001729   Fuel  5637369057 Peter 
C0001729   Fuel  NULL  House 
C0001729   ECD  NULL   House 
C0001729   BSC  5637263239 Andrew 

我想一个方法来删除它必须在EXTPERSON空的所有行列只有在另一行具有相同的DIVISIONEXTPERSON有一个值,如果他们不然后离开行并不删除...我希望这是有道理的。有没有办法做到这一点?

有没有简单的方法来做到这一点?

+0

请注意,您只需要选择的代码,然后单击编辑上面的代码按钮。你不需要使用html来格式化它。 [阅读](http://meta.stackexchange.com/questions/22186/how-do-i-format-my-code-blocks) –

回答

0

请使用下面的代码,假设#ACCOUNTS有你的表数据

DELETE A FROM #ACCOUNTS A 
WHERE EXTPERSON IS NULL 
AND EXISTS (SELECT 1 FROM #ACCOUNTS B 
WHERE A.DIVISION = B.DIVISION 
AND ISNULL(B.EXTPERSON,0)<>0) 
+0

谢谢你的帮助! – SagarH

0

你可以用下面的查询:

DELETE FROM t 
FROM tbl t 
WHERE 
EXTPERSON IS NULL 
    AND EXISTS( 
    SELECT 1 FROM tbl WHERE t.DIVISION =DIVISION AND EXTPERSON IS NOT NULL 
    ) 

说明:

我们正在删除其为空并且在查询部分,我们检查具有圣母院DIVISION但其他行外的行在EXTPERSON中有价值。

测试脚本:

create table tbl (CUSTACCOUNT nvarchar(20),DIVISION nvarchar(20), EXTPERSON nvarchar(20),SALESMAN nvarchar(20)) 
INSERT INTO tbl values 
('C0001729','ECD','5637263283','Ian') 
,('C0001729','Fuel','5637369057','Peter') 
,('C0001729','Fuel',  NULL,'House') 
,('C0001729','ECD',  NULL,'House') 
,('C0001729','BSC','5637263239','Andrew') 

select * from tbl 
begin transaction 

DELETE FROM t 
FROM tbl t 
WHERE 
EXTPERSON IS NULL 
    AND EXISTS( 
    SELECT 1 FROM tbl WHERE t.DIVISION =DIVISION AND EXTPERSON IS NOT NULL 
    ) 

select * from tbl 
rollback transaction 

drop table tbl 

结果:

enter image description here

0

对于这样的任务,我用左连接,并检查在,如果我有一个链接。

对于为例,对于SQL结构为:

`a`(`id`, `type`, `val`) 

,如果我要“只选择线,ID在内,已经有同类型比另一个” ......

select a1.* from `a` a1 left join `a` a2 on a2.`type`=a1.`type` and a2.`id`!=a1.`id` where a2.`id` is not null; 

这样的任务也可以使用group by,count,having来执行子查询......但子查询是。呃。子查询。

0
DELETE from TABLE1 T1 where EXISTS 
(select CUSTACCOUNT, DIVISION, EXTPERSON,SALESMAN from TABLE2 T2 

where EXTPERSON IS NULL AND T1.DIVISION<>T2.DIVISION 
) and EXTPERSON IS NULL 
0

数据采样设置:

create table #data (CUSTACCOUNT varchar(50), DIVISION varchar(50), EXTPERSON varchar(50), SALESMAN varchar(50)) 
insert into #data values 
    ('C0001729', 'ECD', '5637263283', 'Ian'), 
    ('C0001729', 'Fuel', '5637369057', 'Peter'), 
    ('C0001729', 'Fuel', NULL, 'House'), 
    ('C0001729', 'ECD', NULL, 'House'), 
    ('C0001729', 'BSC', '5637263239', 'Andrew'), 
    ('C0001729', 'SomeOther', NULL, 'Name') 

删除查询:

;with aData 
as (
    select 
     rn = row_number() over (partition by DIVISION order by EXTPERSON desc), 
     cntExt = count(EXTPERSON) over (partition by DIVISION) 
    from #data 
) 
delete from aData 
where rn > cntExt and cntExt > 0 

检查表数据:

select * from #data 

输出:

CUSTACCOUNT DIVISION EXTPERSON SALESMAN 
------------ ----------- ----------- ---------- 
C0001729  ECD   5637263283 Ian 
C0001729  Fuel  5637369057 Peter 
C0001729  BSC   5637263239 Andrew 
C0001729  SomeOther NULL  Name 
0
delete delTable 
    from table delTable 
    join table hasValue 
     on delTable.EXTPERSON is null 
     and hasValue.EXTPERSON is not null 
     and delTable.DIVISION = hasValue.DIVISION 
相关问题