其他人编写了一个有效的 SQL Server 查询,我负责将其移植到 Postgres。
除了非常基本的 SQL 命令之外,我真的不了解这两个数据库(我正在按照教程的方式进行操作,并将继续以任何一种方式进行,但我希望尽快解决这个问题)。
无论如何,我在第 4 行遇到了错误,
错误:timeloggedtoday.date_logged 列不存在
我认为这来自第 89 行附近的部分(标有 **),但我无法弄清楚语法应该是什么——我尝试从文档中复制 WITH/AS 部分,但要么我是仍然犯错误或错误在其他地方。下面可能有很多重复/无关的代码,但我认为最好将它们全部包含在内,因为当我更改为 Postgres 语法时,很容易引入其他错误。
编辑:
如果我删除有问题的部分,错误将更改为
错误:列 timelogged1daysago.date_logged 不存在
这是下一批类似的代码,让我相信我在命名我的临时表时犯了一些语法错误(正确的术语?)但我看不出有什么问题,而且很难在文档中找到相关部分......毫不奇怪,谷歌搜索“With”或“As”毫无帮助。
SELECT users.author,
users.display_name,
timeloggedToday.date_logged "DATE_LOGGED_TODAY",
timeloggedToday.time_in_hours "TIME_IN_HOURS_TODAY",
timeloggedToday.difference_days "DIFFERENCE_DAYS_TODAY",
CASE
WHEN Ifnull(timeloggedToday.time_in_hours, 0) = 0 THEN 'No Time Logged'
WHEN timeloggedToday.time_in_hours < 3.0 THEN 'User has not logged sufficient time'
ELSE 'user has logged sufficient time'
END "STATUS_TODAY",
timelogged1daysago.date_logged "DATE_LOGGED_1DAYSAGO",
timelogged1daysago.time_in_hours "TIME_IN_HOURS_1DAYSAGO",
timelogged1daysago.difference_days "DIFFERENCE_DAYS_1DAYSAGO",
CASE
WHEN Ifnull(timelogged1daysago.time_in_hours, 0) = 0 THEN 'No Time Logged'
WHEN timelogged1daysago.time_in_hours < 3.0 THEN 'User has not logged sufficient time'
ELSE 'user has logged sufficient time'
END "STATUS_1DAYSAGO",
timelogged2daysago.date_logged "DATE_LOGGED_2DAYSAGO",
timelogged2daysago.time_in_hours "TIME_IN_HOURS_2DAYSAGO",
timelogged2daysago.difference_days "DIFFERENCE_DAYS_2DAYSAGO",
CASE
WHEN Ifnull(timelogged2daysago.time_in_hours, 0) = 0 THEN 'No Time Logged'
WHEN timelogged2daysago.time_in_hours < 3.0 THEN 'User has not logged sufficient time'
ELSE 'user has logged sufficient time'
END "STATUS_2DAYSAGO",
timelogged3daysago.date_logged "DATE_LOGGED_3DAYSAGO",
timelogged3daysago.time_in_hours "TIME_IN_HOURS_3DAYSAGO",
timelogged3daysago.difference_days "DIFFERENCE_DAYS_3DAYSAGO",
CASE
WHEN Ifnull(timelogged3daysago.time_in_hours, 0) = 0 THEN 'No Time Logged'
WHEN timelogged3daysago.time_in_hours < 3.0 THEN 'User has not logged sufficient time'
ELSE 'user has logged sufficient time'
END "STATUS_3DAYSAGO",
timelogged4daysago.date_logged "DATE_LOGGED_4DAYSAGO",
timelogged4daysago.time_in_hours "TIME_IN_HOURS_4DAYSAGO",
timelogged4daysago.difference_days "DIFFERENCE_DAYS_4DAYSAGO",
CASE
WHEN Ifnull(timelogged4daysago.time_in_hours, 0) = 0 THEN 'No Time Logged'
WHEN timelogged4daysago.time_in_hours < 3.0 THEN 'User has not logged sufficient time'
ELSE 'user has logged sufficient time'
END "STATUS_4DAYSAGO",
timelogged5daysago.date_logged "DATE_LOGGED_5DAYSAGO",
timelogged5daysago.time_in_hours "TIME_IN_HOURS_5DAYSAGO",
timelogged5daysago.difference_days "DIFFERENCE_DAYS_5DAYSAGO",
CASE
WHEN Ifnull(timelogged5daysago.time_in_hours, 0) = 0 THEN 'No Time Logged'
WHEN timelogged5daysago.time_in_hours < 3.0 THEN 'User has not logged sufficient time'
ELSE 'user has logged sufficient time'
END "STATUS_5DAYSAGO",
timelogged6daysago.date_logged "DATE_LOGGED_6DAYSAGO",
timelogged6daysago.time_in_hours "TIME_IN_HOURS_6DAYSAGO",
timelogged6daysago.difference_days "DIFFERENCE_DAYS_6DAYSAGO",
CASE
WHEN Ifnull(timelogged6daysago.time_in_hours, 0) = 0 THEN 'No Time Logged'
WHEN timelogged6daysago.time_in_hours < 3.0 THEN 'User has not logged sufficient time'
ELSE 'user has logged sufficient time'
END "STATUS_6DAYSAGO",
timelogged7daysago.date_logged "DATE_LOGGED_7DAYSAGO",
timelogged7daysago.time_in_hours "TIME_IN_HOURS_7DAYSAGO",
timelogged7daysago.difference_days "DIFFERENCE_DAYS_7DAYSAGO",
CASE
WHEN Ifnull(timelogged7daysago.time_in_hours, 0) = 0 THEN 'No Time Logged'
WHEN timelogged7daysago.time_in_hours < 3.0 THEN 'User has not logged sufficient time'
ELSE 'user has logged sufficient time'
END "STATUS_7DAYSAGO",
lastReportedTime.last_time_logged
FROM
(SELECT lower_child_name AS "author",
cwd_user.display_name
FROM cwd_membership
LEFT JOIN cwd_user ON (cwd_membership.lower_child_name = cwd_user.user_name
AND cwd_user.directory_id = cwd_membership.directory_id)
WHERE lower_parent_name = 'jira-developers'
AND cwd_membership.directory_id = 10100) users
**LEFT JOIN
(SELECT app_user.lower_user_name,
to_char(startdate, '%Y-%m-%d') AS "DATE_LOGGED",
Sum(timeworked) / 3600 "TIME_IN_HOURS",
startdate - Now() "DIFFERENCE_DAYS"
FROM worklog
LEFT JOIN app_user ON worklog.author = app_user.user_key
WHERE to_char(Now() - INTERVAL '8 days', '%Y-%m-%d') < to_char(startdate, '%Y-%m-%d')
AND startdate - Now() = INTERVAL '0 days'
GROUP BY app_user.lower_user_name,
to_char(startdate, '%Y-%m-%d'),
Date(Now()),
worklog.startdate
ORDER BY app_user.lower_user_name,
to_char(startdate, '%Y-%m-%d'),
Date(Now())) timeloggedToday ON timeloggedToday.lower_user_name = users.author**
LEFT JOIN
(SELECT app_user.lower_user_name,
to_char(startdate, '%Y-%m-%d') AS "DATE_LOGGED",
Sum(timeworked) / 3600 "TIME_IN_HOURS",
startdate - Now() "DIFFERENCE_DAYS"
FROM worklog
LEFT JOIN app_user ON worklog.author = app_user.user_key
WHERE to_char(Now() - INTERVAL '8 days', '%Y-%m-%d') < to_char(startdate, '%Y-%m-%d')
AND startdate - Now() = INTERVAL '-1 days'
GROUP BY app_user.lower_user_name,
to_char(startdate, '%Y-%m-%d'),
Date(Now()),
worklog.startdate
ORDER BY app_user.lower_user_name,
to_char(startdate, '%Y-%m-%d'),
Date(Now())) timelogged1daysago ON timelogged1daysago.lower_user_name = users.author
LEFT JOIN
(SELECT app_user.lower_user_name,
to_char(startdate, '%Y-%m-%d') AS "DATE_LOGGED",
Sum(timeworked) / 3600 "TIME_IN_HOURS",
startdate - Now() "DIFFERENCE_DAYS"
FROM worklog
LEFT JOIN app_user ON worklog.author = app_user.user_key
WHERE to_char(Now() - INTERVAL '8 days', '%Y-%m-%d') < to_char(startdate, '%Y-%m-%d')
AND startdate - Now() = INTERVAL '-2 days'
GROUP BY app_user.lower_user_name,
to_char(startdate, '%Y-%m-%d'),
Date(Now()),
worklog.startdate
ORDER BY app_user.lower_user_name,
to_char(startdate, '%Y-%m-%d'),
Date(Now())) timelogged2daysago ON timelogged2daysago.lower_user_name = users.author
LEFT JOIN
(SELECT app_user.lower_user_name,
to_char(startdate, '%Y-%m-%d') AS "DATE_LOGGED",
Sum(timeworked) / 3600 "TIME_IN_HOURS",
startdate - Now() "DIFFERENCE_DAYS"
FROM worklog
LEFT JOIN app_user ON worklog.author = app_user.user_key
WHERE to_char(Now() - INTERVAL '8 days', '%Y-%m-%d') < to_char(startdate, '%Y-%m-%d')
AND startdate - Now() = INTERVAL '-3 days'
GROUP BY app_user.lower_user_name,
to_char(startdate, '%Y-%m-%d'),
Date(Now()),
worklog.startdate
ORDER BY app_user.lower_user_name,
to_char(startdate, '%Y-%m-%d'),
Date(Now())) timelogged3daysago ON timelogged3daysago.lower_user_name = users.author
LEFT JOIN
(SELECT app_user.lower_user_name,
to_char(startdate, '%Y-%m-%d') AS "DATE_LOGGED",
Sum(timeworked) / 3600 "TIME_IN_HOURS",
startdate - Now() "DIFFERENCE_DAYS"
FROM worklog
LEFT JOIN app_user ON worklog.author = app_user.user_key
WHERE to_char(Now() - INTERVAL '8 days', '%Y-%m-%d') < to_char(startdate, '%Y-%m-%d')
AND startdate - Now() = INTERVAL '-4 days'
GROUP BY app_user.lower_user_name,
to_char(startdate, '%Y-%m-%d'),
Date(Now()),
worklog.startdate
ORDER BY app_user.lower_user_name,
to_char(startdate, '%Y-%m-%d'),
Date(Now())) timelogged4daysago ON timelogged4daysago.lower_user_name = users.author
LEFT JOIN
(SELECT app_user.lower_user_name,
to_char(startdate, '%Y-%m-%d') AS "DATE_LOGGED",
Sum(timeworked) / 3600 "TIME_IN_HOURS",
startdate - Now() "DIFFERENCE_DAYS"
FROM worklog
LEFT JOIN app_user ON worklog.author = app_user.user_key
WHERE to_char(Now() - INTERVAL '8 days', '%Y-%m-%d') < to_char(startdate, '%Y-%m-%d')
AND startdate - Now() = INTERVAL '-5 days'
GROUP BY app_user.lower_user_name,
to_char(startdate, '%Y-%m-%d'),
Date(Now()),
worklog.startdate
ORDER BY app_user.lower_user_name,
to_char(startdate, '%Y-%m-%d'),
Date(Now())) timelogged5daysago ON timelogged5daysago.lower_user_name = users.author
LEFT JOIN
(SELECT app_user.lower_user_name,
to_char(startdate, '%Y-%m-%d') AS "DATE_LOGGED",
Sum(timeworked) / 3600 "TIME_IN_HOURS",
startdate - Now() "DIFFERENCE_DAYS"
FROM worklog
LEFT JOIN app_user ON worklog.author = app_user.user_key
WHERE to_char(Now() - INTERVAL '8 days', '%Y-%m-%d') < to_char(startdate, '%Y-%m-%d')
AND startdate - Now() = INTERVAL '-6 days'
GROUP BY app_user.lower_user_name,
to_char(startdate, '%Y-%m-%d'),
Date(Now()),
worklog.startdate
ORDER BY app_user.lower_user_name,
to_char(startdate, '%Y-%m-%d'),
Date(Now())) timelogged6daysago ON timelogged6daysago.lower_user_name = users.author
LEFT JOIN
(SELECT app_user.lower_user_name,
to_char(startdate, '%Y-%m-%d') AS "DATE_LOGGED",
Sum(timeworked) / 3600 "TIME_IN_HOURS",
startdate - Now() "DIFFERENCE_DAYS"
FROM worklog
LEFT JOIN app_user ON worklog.author = app_user.user_key
WHERE to_char(Now() - INTERVAL '8 days', '%Y-%m-%d') < to_char(startdate, '%Y-%m-%d')
AND startdate - Now() = INTERVAL '-7 days'
GROUP BY app_user.lower_user_name,
to_char(startdate, '%Y-%m-%d'),
Date(Now()),
worklog.startdate
ORDER BY app_user.lower_user_name,
to_char(startdate, '%Y-%m-%d'),
Date(Now())) timelogged7daysago ON timelogged7daysago.lower_user_name = users.author
LEFT JOIN
(SELECT app_user.lower_user_name,
Max(startdate) AS "last_time_logged"
FROM worklog
LEFT JOIN app_user ON worklog.author = app_user.user_key
GROUP BY app_user.lower_user_name) lastReportedTime ON lastReportedTime.lower_user_name = users.author
编辑:更简单的查询
我想我已经编辑了一些无关的东西,希望能找到这个错误。无论如何,这个较短的查询至少给了我同样的错误,所以这可能更容易帮助我调试:
SELECT users.author,
users.display_name,
timeloggedToday.date_logged "DATE_LOGGED_TODAY",
timeloggedToday.time_in_hours "TIME_IN_HOURS_TODAY",
timeloggedToday.difference_days "DIFFERENCE_DAYS_TODAY",
CASE
WHEN Ifnull(timeloggedToday.time_in_hours, 0) = 0 THEN 'No Time Logged'
WHEN timeloggedToday.time_in_hours < 3.0 THEN 'User has not logged sufficient time'
ELSE 'user has logged sufficient time'
END "STATUS_TODAY",
lastReportedTime.last_time_logged
FROM
(SELECT lower_child_name AS "author",
cwd_user.display_name
FROM cwd_membership
LEFT JOIN cwd_user ON (cwd_membership.lower_child_name = cwd_user.user_name
AND cwd_user.directory_id = cwd_membership.directory_id)
WHERE lower_parent_name = 'jira-developers'
AND cwd_membership.directory_id = 10100) users
LEFT JOIN
(SELECT app_user.lower_user_name,
to_char(startdate, '%Y-%m-%d') AS "DATE_LOGGED",
Sum(timeworked) / 3600 "TIME_IN_HOURS",
startdate - Now() "DIFFERENCE_DAYS"
FROM worklog
LEFT JOIN app_user ON worklog.author = app_user.user_key
WHERE to_char(Now() - INTERVAL '8 days', '%Y-%m-%d') < to_char(startdate, '%Y-%m-%d')
AND startdate - Now() = INTERVAL '0 days'
GROUP BY app_user.lower_user_name,
to_char(startdate, '%Y-%m-%d'),
Date(Now()),
worklog.startdate
ORDER BY app_user.lower_user_name,
to_char(startdate, '%Y-%m-%d'),
Date(Now())) timeloggedToday ON timeloggedToday.lower_user_name = users.author
LEFT JOIN
(SELECT app_user.lower_user_name,
Max(startdate) AS "last_time_logged"
FROM worklog
LEFT JOIN app_user ON worklog.author = app_user.user_key
GROUP BY app_user.lower_user_name) lastReportedTime ON lastReportedTime.lower_user_name = users.author