如何重写查询以在没有 WITH 语法的情况下工作
How to rewrite query to work without WITH syntax
只是寻求一些关于如何在不使用 WITH 的情况下重写此查询的帮助。
我知道我需要用子查询的主体替换对 WITH 子查询的引用,但我不确定如何。谢谢
WITH current_employees AS (
SELECT DISTINCT emp_id
FROM appointment
WHERE end_date IS NULL
),
appointments_2015 AS (
SELECT a.emp_id, salary,
CASE WHEN start_date < '2015-01-01' THEN '2015-01-01' ELSE start_date END AS start_date,
CASE WHEN end_date < '2016-01-01' THEN end_date ELSE '2015-12-31' END AS end_date
FROM appointment a
JOIN current_employees ce ON a.emp_id = ce.emp_id
WHERE start_date < '2016-01-01' AND (end_date >= '2015-01-01' OR end_date IS NULL)
)
SELECT
emp_id,
SUM( salary * (end_date - start_date + 1) / 365 ) AS total
FROM appointments_2015
GROUP BY emp_id
由于 CTE 仅被引用一次,因此更改非常简单。为每个 CTE 创建一个派生的 table(有时称为“内联视图”或简称为 sub-select)
SELECT
emp_id,
SUM( salary * (end_date - start_date + 1) / 365 ) AS total
FROM (
SELECT a.emp_id, salary,
CASE WHEN start_date < '2015-01-01' THEN '2015-01-01' ELSE start_date END AS start_date,
CASE WHEN end_date < '2016-01-01' THEN end_date ELSE '2015-12-31' END AS end_date
FROM appointment a
JOIN (
SELECT DISTINCT emp_id
FROM appointment
WHERE end_date IS NULL
) current_employees ce ON a.emp_id = ce.emp_id
WHERE start_date < '2016-01-01' AND (end_date >= '2015-01-01' OR end_date IS NULL)
) appointments_2015
GROUP BY emp_id
你好像想要在职员工2015年的工资。如果是:
SELECT a.emp_id,
SUM( salary * (end_date_2015 - start_date_2015 + 1) / 365 ) AS total
FROM (SELECT a.*,
(CASE WHEN start_date < '2015-01-01' THEN '2015-01-01'
WHEN start_date < '2016-01-01' THEN start_date
END) AS start_date_2015,
(CASE WHEN end_date < '2015-01-01' THEN NULL
WHEN end_date < '2016-01-01' THEN end_date
ELSE '2015-12-31'
END) AS end_date
FROM appointments_2015 a
) a
GROUP BY emp_id
HAVING COUNT(end_date) <> COUNT(*);
只是寻求一些关于如何在不使用 WITH 的情况下重写此查询的帮助。 我知道我需要用子查询的主体替换对 WITH 子查询的引用,但我不确定如何。谢谢
WITH current_employees AS (
SELECT DISTINCT emp_id
FROM appointment
WHERE end_date IS NULL
),
appointments_2015 AS (
SELECT a.emp_id, salary,
CASE WHEN start_date < '2015-01-01' THEN '2015-01-01' ELSE start_date END AS start_date,
CASE WHEN end_date < '2016-01-01' THEN end_date ELSE '2015-12-31' END AS end_date
FROM appointment a
JOIN current_employees ce ON a.emp_id = ce.emp_id
WHERE start_date < '2016-01-01' AND (end_date >= '2015-01-01' OR end_date IS NULL)
)
SELECT
emp_id,
SUM( salary * (end_date - start_date + 1) / 365 ) AS total
FROM appointments_2015
GROUP BY emp_id
由于 CTE 仅被引用一次,因此更改非常简单。为每个 CTE 创建一个派生的 table(有时称为“内联视图”或简称为 sub-select)
SELECT
emp_id,
SUM( salary * (end_date - start_date + 1) / 365 ) AS total
FROM (
SELECT a.emp_id, salary,
CASE WHEN start_date < '2015-01-01' THEN '2015-01-01' ELSE start_date END AS start_date,
CASE WHEN end_date < '2016-01-01' THEN end_date ELSE '2015-12-31' END AS end_date
FROM appointment a
JOIN (
SELECT DISTINCT emp_id
FROM appointment
WHERE end_date IS NULL
) current_employees ce ON a.emp_id = ce.emp_id
WHERE start_date < '2016-01-01' AND (end_date >= '2015-01-01' OR end_date IS NULL)
) appointments_2015
GROUP BY emp_id
你好像想要在职员工2015年的工资。如果是:
SELECT a.emp_id,
SUM( salary * (end_date_2015 - start_date_2015 + 1) / 365 ) AS total
FROM (SELECT a.*,
(CASE WHEN start_date < '2015-01-01' THEN '2015-01-01'
WHEN start_date < '2016-01-01' THEN start_date
END) AS start_date_2015,
(CASE WHEN end_date < '2015-01-01' THEN NULL
WHEN end_date < '2016-01-01' THEN end_date
ELSE '2015-12-31'
END) AS end_date
FROM appointments_2015 a
) a
GROUP BY emp_id
HAVING COUNT(end_date) <> COUNT(*);