mysql - 子查询和公用表表达式
问题描述
嗨,我想了解如何在子查询与公用表表达式中构造查询:请参见下面的示例。
编写一个查询来计算 health.user_logs 表中的重复数据记录
方法一:使用子查询:select count 语句在开头
SELECT COUNT(*)
FROM (
SELECT DISTINCT *
FROM health.user_logs
) AS subquery;
方法二:使用公用表表达式:select count语句到底是什么?
WITH deduped_logs AS (
SELECT DISTINCT *
FROM health.user_logs
)
SELECT COUNT(*)
FROM deduped_logs;
何时决定 select count 语句应该在开头还是结尾?
解决方案
大多数情况下,这与个人偏好有关,即您更喜欢什么并认为更具可读性。
SELECT ...
FROM
(
SELECT ...
FROM some_table
WHERE ...
) AS subquery
JOIN another_table ON ...
和
WITH
(
SELECT ...
FROM some_table
WHERE ...
) AS subquery
SELECT ...
FROM subquery
JOIN another_table ON ...
是等效的,一个和另一个一样好。该子句的一个优点WITH
是您可以多次访问同一个子查询:
WITH
(
SELECT ...
FROM some_table
WHERE ...
) AS subquery
SELECT ...
FROM subquery s1
JOIN subquery s2 ON s2.type = s1.type AND s2.id < s1.id
另一个优点是您可以逐步构建查询,而无需在子查询中嵌套子查询(至少不可见),因此可以认为查询更具可读性:
WITH all_jobs AS (...)
, technical_jobs AS (... FROM all_jobs ...)
, well_paid_technical_jobs AS (... FROM technical_jobs ...)
SELECT *
FROM well_paid_technical_jobs
WHERE ...
对比
SELECT *
FROM
(
SELECT ...
FROM
(
SELECT ...
FROM
(
...
) all_jobs
WHERE ...
) technical_jobs
WHERE ...
) well_paid_technical_jobs
WHERE ...
推荐阅读
- sql - PostgreSQL 中两个日期的区别
- r - 对于 R 数据框中的每一列
- iot - 我们可以在应用程序中将 IoTConnect 用于 UI SDK 而不是 API 调用吗
- javascript - 继承div高度
- c# - MemoryStream 容量问题。是否有另一个流类,如 memorystream,而不是 memorytributary?
- cmake - 如何在 CMakeLists.txt 中添加不同的目录?
- c++ - 查找以文件类型打包的图像文件。(二进制)
- jwt - 如何将 jsonwebtoken (JWT) 添加到请求标头?
- java - 如何在 Java 中使用“minOccurs”验证 xml?
- java - Artemis-2.6.3 控制台:服务不可用