1 学习参考
2 LeetCode 题目
题目- Person表
- +-------------+---------+
- | Column Name | Type |
- +-------------+---------+
- | id | int |
- | email | varchar |
- +-------------+---------+
- id是该表的主键列。该表的每一行包含一封电子邮件。电子邮件将不包含大写字母。
复制代码 要求
编写一个 SQL 删除语句来删除所有重复的电子邮件,只保留一个id 最小的唯一电子邮件。以任意顺序返回结果表。(注意:仅需要写删除语句)
示例- 输入:
- Person 表
- +----+------------------+
- | id | email |
- +----+------------------+
- | 1 | john@example.com |
- | 2 | bob@example.com |
- | 3 | john@example.com |
- +----+------------------+
- 输出:
- +----+------------------+
- | id | email |
- +----+------------------+
- | 1 | john@example.com |
- | 2 | bob@example.com |
- +----+------------------+
- 解释: john@example.com重复两次。我们保留最小的Id = 1。
复制代码 用 Multiple-table Delete 解答- DELETE
- p1
- FROM
- Person p1, p2
- WHERE
- p1.Email = p2.Email AND p1.Id > p2.Id
复制代码 3 多表删除的用法
3.1 Multiple-Table Syntax(多表语法)
第1种DELETE语句- DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
- tbl_name[.*] [, tbl_name[.*]] ...
- FROM table_references
- [WHERE where_condition]
复制代码 第2种DELETE语句- DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
- FROM tbl_name[.*] [, tbl_name[.*]] ...
- USING table_references
- [WHERE where_condition]
复制代码 3.2 Multi-Table Deletes(多表删除)
你可以在一个 DELETE 语句中指定多个表,根据 WHERE 子句中的条件,从一个或多个表中删除记录。你不能在多表DELETE 语句中使用 ORDER BY 或 LIMIT。table_references子句列出了参与连接的表。
- 对于第一种多表语法,只有在 FROM 子句前列出的表中的匹配记录被删除。
- 对于第二种多表语法,只有从 FROM 子句中列出的表(在 USING 子句之前)的匹配记录被删除。这样做的效果是,你可以同时从许多表中删除记录,并且有额外的表只用于搜索。
- DELETE t1
- FROM t1 INNER JOIN t2
- WHERE t1.id=t2.id;
复制代码 或者- DELETE
- FROM t1,
- USING t1 INNER JOIN t2
- WHERE t1.id=t2.id ;
复制代码 这些语句在 t1、t2 两个表中搜索要删除的记录,但是只从表t1中删除匹配的记录。
前面的例子使用了INNER JOIN。
请注意 !!!
很多地方会使用省略的写法:FROM t1, t2 ,这和FROM t1 INNER JOIN t2 是一样的。
多表 DELETE 语句也可以使用SELECT语句中允许的其他类型的连接,例如 LEFT JOIN。例如,要删除存在于t1中但在t2中没有匹配的记录,可以使用LEFT JOIN:DELETE t1 FROM t1 LEFT JOIN t2 ON t1.id=t2.id WHERE t2.id IS NULL;
注意 !!!
如果你为一个表声明了一个别名,你在引用该表时必须使用该别名。
DELETE t1 FROM test AS t1, test2 WHERE ...
多表 DELETE中 的表别名应该只在语句的table_references部分声明。在其他地方,允许引用别名,但不允许声明别名。
正确:- DELETE a1, a2 FROM t1 AS a1 INNER JOIN t2 AS a2
- WHERE a1.id=a2.id;
- DELETE FROM a1, a2 USING t1 AS a1 INNER JOIN t2 AS a2
- WHERE a1.id=a2.id;
复制代码 错误:- DELETE t1 AS a1, t2 AS a2 FROM t1 INNER JOIN t2
- WHERE a1.id=a2.id;
- DELETE FROM t1 AS a1, t2 AS a2 USING t1 INNER JOIN t2
- WHERE a1.id=a2.id;
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |