用于更新表的 SQL 查询

标签 sql

可能是个愚蠢的例子,但很想知道我们如何使用 SQL 查询来做到这一点。我正在使用 MySQL,但尝试以独立的方式编写查询数据库。

我有下表,

Course
---------
Id | lang    | batch | flag
===========================
1  | Java    |  A    | null
2  | Cpp     |  B    | null
3  | Java    |  A    | null
4  | Java    |  C    | null
5  | Java    |  C    | null

查询是,如果在同一批处理中找到 lang = Java 的两条记录,则为表中的第一个条目设置 flag = 0,为第二个条目设置 flag = 1。

因此上述查询的输出如下所示,

Course
---------
Id | lang    | batch | flag
===========================
1  | Java    |  A    | 0
2  | Cpp     |  B    | null
3  | Java    |  A    | 1
4  | Java    |  C    | 0
5  | Java    |  C    | 1

如何为上面的示例编写 SQL 查询。感谢您的帮助:)

编辑: 抱歉,编辑较晚,有一项添加,例如如果仅找到 lang = java 和任何批处理的一条记录,则将标志设置为 0。 是否可以在单个查询中编写两个查询?

最佳答案

假设给定的匹配批处理只有两条记录,以下内容应该可以正常工作:

UPDATE Course t1
INNER JOIN
(
    SELECT batch
    FROM Course
    GROUP BY batch
    HAVING SUM(CASE WHEN lang = 'Java' THEN 1 ELSE 0 END) = 2
) t2
    ON t1.batch = t2.batch
INNER JOIN
(
    SELECT batch, MIN(Id) AS minId
    FROM Course
    GROUP BY batch
) t3
    ON t2.batch = t3.batch
SET t1.flag = CASE WHEN t1.Id = t3.minId THEN 0 ELSE 1 END

此处演示:

SQLFiddle

注意:上面的 Fiddle 执行 SELECT 来显示哪些记录将被更新,以及每个记录的旧标志值和新标志值是什么。

您需要使用的确切JOIN语法是特定于数据库的。我给出了 MySQL 的语法,但查询在转到另一个 RDBMS(例如 SQL Server)时不应发生太大变化,只要它支持连接更新。

关于用于更新表的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40881702/

相关文章:

sql - 在左侧外连接的右侧表上添加过滤器

mysql - 在 MySQL/MariaDB 中将 CHAR 主键转换为 INT

android - SQLITE - 从账单表中获取前 5 名付费客户

sql - 查询在 postgresql 中没有相应地工作

mysql - sql查询中的加权和

mysql - SQL数量计算

c# - 连接的 SQL 列返回空值,是否有解决方法?

mysql - SQL 查询以连接结果中的列

mysql - 选择一个mysql表的所有内容,并回显对应类别的列表

mysql - 对 2 列进行查询,就好像它们是一列一样