2012-11-12 82 views
2

我有一個包含零件號和相關組件零件號和位置的表。每個part_no可能有多個組件或根本沒有。SQL Server:刪除具有多條記錄(NULL)的行

下面是一個例子

Part_No | Component_Part_No | Location 
-----------------------------------------  
12345 | NULL    | 001 
50001 | NULL    | 001 
50001 | 4001    | 001 
50001 | 4002    | 001 

的部分沒有5001具有空值,以及其他組件。我希望能夠刪除具有零件50001的NULL值的行,但保持零件12345不變。問題是50001的NULL值在表中不正確,我需要刪除這些行。

任何幫助表示讚賞。

謝謝

+0

您是否需要從表格中逐字刪除一行?或者你有可能有很多行適合類似的模式? –

+0

部分編號50001只是一個例子..有超過16k部分沒有,所以我正在尋找一個解決方案的所有部分nos - 感謝 – Alex

回答

2
delete from table where Part_No = 50001 and Component_Part_No IS NULL 
6
DELETE from table 
WHERE component_part_no IS NULL 
AND part_no in 
    (SELECT part_no 
    FROM table 
    WHERE component_part_no IS NOT NULL) 
+0

部分編號50001只是一個例子..有超過16k部分沒有這樣我正在尋找所有部分的解決方案 - 謝謝 – Alex

+0

那麼你想刪除什麼?帶有空值的零件號也具有非空值?即爲什麼要刪除50001而不是12345?看修改後的答案。 – FJT

1

有寫它的可能更漂亮的方式,但這應該做你想要什麼:

delete from Table 
where Component_Part_No is null 
and Part_No in (select Part_No from Table 
       where Component_Part_No is not null) 
0
DECLARE @tab TABLE(Part_No INT,Component_Part_No INT,Location VARCHAR(3)) 
INSERT INTO @tab 
SELECT 12345,NULL,'001' UNION ALL 
SELECT 50001,NULL,'001' UNION ALL 
SELECT 50001,4001,'001' UNION ALL 
SELECT 50001,4001,'001' UNION ALL 
SELECT 11111,NULL,'001' UNION ALL 
SELECT 11111,5001,'002' UNION ALL 
SELECT 22222,NULL,'003' UNION ALL 
SELECT 22222,6001,'003' UNION ALL 
SELECT 33333,NULL,'003' 

SELECT * FROM @tab; 

DELETE 
FROM @tab 
Part_No IN 
(
SELECT Part_No 
FROM @tab 
GROUP BY Part_No 
HAVING COUNT(*) > 1 
) 
AND [@tab].Component_Part_No IS NULL 

SELECT * FROM @tab; 

SQL小提琴 - http://sqlfiddle.com/#!3/613c1/1

1

得到這個權利...零件有組件。如果零件沒有已知的零部件,那麼它至關重要的是存儲零件位置信息(作爲一個整體),零件是否具有已知零件,沒有零件的零件是不正確的,是嗎?

delete parts 
from parts 
    inner join parts selff 
     on parts.Part_no = selff.Part_no 
      and selff.Component_Part_No is not null 
where parts.Component_Part_No is null 
相關問題