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?
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?
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 (?,?,?,?,?,?,?,?)
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
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 ############################
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);
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ó). –
Đâ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
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
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
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
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 ... –