2016-03-11 71 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 
相關問題