可能是个愚蠢的例子,但很想知道我们如何使用 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/