WITH a AS(SELECT user_id,No,Date,Project,Action,Comment,Hours,WEEK(Date,1) AS `week` FROM DSC.timeRecord_history ORDER BY user_id, WEEK(Date,1),No) SELECT * FROM DSC.timeRecord_history WHERE (user_id,No,WEEK(Date,1)) IN( SELECT user_id,No,WEEK(Date,1) FROM a WHERE Project = "" AND Action = "" GROUP BY user_id, WEEK(Date,1), No )b ; 请问以上sql语句有何问题?
时间: 2023-09-15 18:16:11 浏览: 185
以上 SQL 语句存在以下问题:
1. 在 `WITH` 子句中定义的临时表名为 `a`,但在最后的查询语句中却使用了 `DSC.timeRecord_history` 表,这会导致 SQL 语法错误。
2. 在 `WHERE` 子句中使用了 `IN` 运算符,但子查询中选择的列只有 `user_id`、`No`、`WEEK(Date,1)` 三列,而最后的查询语句中使用了 `SELECT *`,这会导致选择的列数目不匹配。
3. 在子查询中使用了 `GROUP BY` 子句,但选择的列中包含了非聚合列 `No`、`Date`、`Project`、`Action`、`Comment`、`Hours`,这会导致 SQL 语法错误。
因此,可以考虑修改 SQL 语句如下:
```sql
WITH a AS (
SELECT
user_id,
No,
WEEK(Date, 1) AS `week`
FROM DSC.timeRecord_history
WHERE Project = '' AND Action = ''
GROUP BY user_id, No, WEEK(Date, 1)
),
b AS (
SELECT
t.*
FROM DSC.timeRecord_history t
JOIN a ON t.user_id = a.user_id AND t.No = a.No AND WEEK(t.Date, 1) = a.week
)
SELECT * FROM b;
```
以上 SQL 语句的含义为:首先在 `timeRecord_history` 表中选出 `Project` 和 `Action` 均为空的记录,并按照 `user_id`、`No`、`WEEK(Date, 1)` 进行分组,然后使用 `JOIN` 操作将分组结果与原表中的记录进行匹配,最后选出所有匹配到的记录并返回。
阅读全文