簡體   English   中英

根據另一個表中的條件刪除表條目

[英]Deleting table entries based on criteria in another table

我們希望能夠根據在另一個表中設置的刪除標准從 MySQL 表中刪除條目。 讓我用一個例子來解釋。
我有兩個表定義如下:

CREATE TABLE base_tbl
(
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  f1 VARCHAR(8),
  f2 VARCHAR(8),
  
  PRIMARY KEY (id)
);


CREATE TABLE del_criteria_tbl
(
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  f3 VARCHAR(8),
  f4 VARCHAR(8),
  
  PRIMARY KEY (id)
);

base_tbl具有數據,而del_criteria_tbl具有從base_tbl中刪除條目的標准。

我按如下方式填充表格:

INSERT INTO base_tbl(f1, f2) VALUES ('ABC', '123C57'),
('ABC', '532B49'), ('DEF', '397F45'),
('DEF', '684G65'), ('GHI', '793A86'),
('GHI', '541H32');  

INSERT INTO del_criteria_tbl(f3, f4) VALUES ('ABC', '532B49'),
('ABC', '813E89'), ('DEF', '397F45'),
('GHI', '541H32');

明顯地:

mysql>SELECT * FROM base_tbl;
+----+------+--------+
| id | f1   | f2     |
+----+------+--------+
|  1 | ABC  | 123C57 |
|  2 | ABC  | 532B49 |
|  3 | DEF  | 397F45 |
|  4 | DEF  | 684G65 |
|  5 | GHI  | 793A86 |
|  6 | GHI  | 541H32 |
+----+------+--------+


mysql>SELECT * FROM del_criteria_tbl;
+----+------+--------+
| id | f3   | f4     |
+----+------+--------+
|  1 | ABC  | 532B49 |
|  2 | ABC  | 813E89 |
|  3 | DEF  | 397F45 |
|  4 | GHI  | 541H32 |
+----+------+--------+

我想定義一個簡潔高效的 SQL 操作,執行如下偽 SQL 邏輯:

DELETE FROM base_tbl WHERE base_tbl.f1 = del_criteria_tbl.f3 AND base_tbl.f2 = del_criteria_tbl.f4

操作執行后, SELECT * FROM base_tbl應該產生:

+----+------+--------+
| id | f1   | f2     |
+----+------+--------+
|  1 | ABC  | 123C57 |
|  4 | DEF  | 684G65 |
|  5 | GHI  | 793A86 |
+----+------+--------+

一個簡單的方法是IN

DELETE b FROM base_tbl b
    WHERE (b.f1, b.f2) IN (SELECT dc.f3, dc.f4
                           FROM del_criteria_tbl dc
                          );

使用(f1, f2)上的索引,您可能會發現JOIN具有更好的性能:

DELETE b
    FROM base_tbl b JOIN
         del_criteria_tbl dc
         ON b.f1 = dc.f3 AND b.f2 = c.f4;

我會推薦exists

delete b
from base_tbl b
where exists (
    select 1
    from del_criteria_tbl dc
    where dc.f1 = b.f1 and dc.f2 = b.f2
)

這似乎是表達您要求的最自然的方式。 exists通常比in大型數據集中更好地擴展。 為了提高性能,您需要del_criteria_tbl(f1, f2)上的索引。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM