2010-10-28 16 views
30

Tôi muốn làm một cái gì đó như thế này:Tôi làm cách nào để xóa nhiều hàng với các ID khác nhau?

DELETE FROM table WHERE id IN (SELECT ....) 

Tôi làm như thế nào?

+0

Cơ sở dữ liệu nào? Trong hầu hết, những gì bạn mô tả chỉ nên làm việc. – Thilo

+0

Bạn không thể làm điều đó như thế nào? Điều gì không hoạt động? Bạn sử dụng cơ sở dữ liệu nào? Oracle/MySql/SqlServer? – Fermin

+0

Làm rõ nơi bạn sẽ nhận được danh sách Id từ ..., có thể xóa vị trí của id trong ... –

Trả lời

80

Nếu bạn phải chọn id:

DELETE FROM table WHERE id IN (SELECT id FROM somewhere_else) 

Nếu bạn đã biết họ (và họ đang không ở trong hàng ngàn):

DELETE FROM table WHERE id IN (?,?,?,?,?,?,?,?) 
+0

Nếu họ ở hàng nghìn người sẽ tác động đến hiệu suất rất nhiều? Tôi đang cố gắng xóa một số bản sao và một số địa điểm tôi có từ 2-3 bản sao. Đối với các mục khác tôi có thể có vài trăm hoặc hàng ngàn. – Zeliax

0

Disclaim: the following suggestion could be an overhead depending on the situation. The function is only tested with MSSQL 2008 R2 but seams be compatible to other versions

nếu bạn wane làm điều này với nhiều Id của bạn có thể có thể sử dụng một function mà tạo ra một bảng tạm thời, nơi bạn sẽ có thể DELETE FROM lựa chọn

cách truy vấn có thể trông giống như:

-- not tested 
-- @ids will contain a varchar with your ids e.g.'9 12 27 37' 
DELETE FROM table WHERE id IN (SELECT i.number FROM iter_intlist_to_tbl(@ids)) 

đây là chức năng:

ALTER FUNCTION iter_intlist_to_tbl (@list nvarchar(MAX)) 
    RETURNS @tbl TABLE (listpos int IDENTITY(1, 1) NOT NULL, 
         number int NOT NULL) AS 

    -- funktion gefunden auf http://www.sommarskog.se/arrays-in-sql-2005.html 
    -- dient zum übergeben einer liste von elementen 

BEGIN 
    -- Deklaration der Variablen 
    DECLARE @startpos int, 
      @endpos int, 
      @textpos int, 
      @chunklen smallint, 
      @str  nvarchar(4000), 
      @tmpstr nvarchar(4000), 
      @leftover nvarchar(4000) 

    -- Startwerte festlegen 
    SET @textpos = 1 
    SET @leftover = '' 

    -- Loop 1 
    WHILE @textpos <= datalength(@list)/2 
    BEGIN 

     -- 
     SET @chunklen = 4000 - datalength(@leftover)/2 --datalength() gibt die anzahl der bytes zurück (mit Leerzeichen) 

     -- 
     SET @tmpstr = ltrim(@leftover + substring(@list, @textpos, @chunklen))--SUBSTRING (@string ,start , length) | ltrim(@string) abschneiden aller Leerzeichen am Begin des Strings 

     --hochzählen der TestPosition 
     SET @textpos = @textpos + @chunklen 

     --start position 0 setzen 
     SET @startpos = 0 

     -- end position bekommt den charindex wo ein [LEERZEICHEN] gefunden wird 
     SET @endpos = charindex(' ' COLLATE Slovenian_BIN2, @tmpstr)--charindex(searchChar,Wo,Startposition) 

     -- Loop 2 
     WHILE @endpos > 0 
     BEGIN 
      --str ist der string welcher zwischen den [LEERZEICHEN] steht 
      SET @str = substring(@tmpstr, @startpos + 1, @endpos - @startpos - 1) 

      --wenn @str nicht leer ist wird er zu int Convertiert und @tbl unter der Spalte 'number' hinzugefügt 
      IF @str <> '' 
       INSERT @tbl (number) VALUES(convert(int, @str))-- convert(Ziel-Type,Value) 

      -- start wird auf das letzte bekannte end gesetzt 
      SET @startpos = @endpos 

      -- end position bekommt den charindex wo ein [LEERZEICHEN] gefunden wird 
      SET @endpos = charindex(' ' COLLATE Slovenian_BIN2, @tmpstr, @startpos + 1) 
     END 
     -- Loop 2 

     -- dient dafür den letzten teil des strings zu selektieren 
     SET @leftover = right(@tmpstr, datalength(@tmpstr)/2 - @startpos)--right(@string,anzahl der Zeichen) bsp.: right("abcdef",3) => "def" 
    END 
    -- Loop 1 

    --wenn @leftover nach dem entfernen aller [LEERZEICHEN] nicht leer ist wird er zu int Convertiert und @tbl unter der Spalte 'number' hinzugefügt 
    IF ltrim(rtrim(@leftover)) <> '' 
     INSERT @tbl (number) VALUES(convert(int, @leftover)) 

    RETURN 
END 


    -- ############################ WICHTIG ############################ 
    -- das is ein Beispiel wie man die Funktion benutzt 
    -- 
    --CREATE PROCEDURE get_product_names_iter 
    --  @ids varchar(50) AS 
    --SELECT P.ProductName, P.ProductID 
    --FROM  Northwind.Products P 
    --JOIN  iter_intlist_to_tbl(@ids) i ON P.ProductID = i.number 
    --go 
    --EXEC get_product_names_iter '9 12 27 37' 
    -- 
    -- Funktion gefunden auf http://www.sommarskog.se/arrays-in-sql-2005.html 
    -- dient zum übergeben einer Liste von Id's 
    -- ############################ WICHTIG ############################ 
1
Delete from BA_CITY_MASTER where CITY_NAME in (select CITY_NAME from BA_CITY_MASTER group by CITY_NAME having count(CITY_NAME)>1); 
+0

Bạn nên định dạng mã của mình bằng cách chọn mã và nhấn ctrl-k. Ngoài ra, nó giúp cung cấp một số giải thích, có lẽ gợi ý những gì đã sai với mã trong câu hỏi (nếu có). –

+0

Đây là một giải pháp tuyệt vời: 'DELETE FROM [TableName] WHERE [ColumnName] IN (SELECT [ColumnName] FROM [TableName] GROUP BY [ColumnName] ĐANG COUNT ([ColumnName])> 1);' – dakab

-4
  • Bạn có thể làm cho điều này.

    CREATE PROC [dbo]. [Sp_DELETE_MULTI_ROW]
    @CODE XML , @ ERRFLAG CHAR (1) = '0' OUTPUT

AS

SET NOCOUNT ON
SET GIAO DỊCH BẢNG CẤP ĐỌC ĐƯỢC ĐẢM BẢO ĐƠN VỊ

DELETE tb_SampleTest WHERE MÃ IN ()CHỌN Item.value (' ' 'VARCHAR (20)') TỪ @ CODE.nodes (' RecordList/ID') AS x (Item) )

NẾU @@ ROWCOUNT = 0 SET @ ERRFLAG = 200

SET NOCOUNT OFF

  • < 'RecordList'> < 'ID'> 1 < '/ ID'> < 'ID'> 2 < '/ ID'> < '/ RecordList' >
Các vấn đề liên quan