如何将 CTE 编码更改为 INLINE 视图?甲骨文 SQL
How to change CTE coding to INLINE view? Oracle SQL
我的系统不允许在编码中使用 CTE,第一个词必须始终是 SELECT。
有人可以解释一下(最好是 Oracle SQL 虚拟格式)我将如何将使用 CTE 编写的代码更改为 INLINE 代码吗?
以CTE代码为例:
WITH table1
AS (SELECT enquiry_status_log.enquiry_number,
enquiry_status_log.enquiry_log_number,
follow_up.follow_up_name,
enquiry_status_log.follow_up_date,
RANK ()
OVER (PARTITION BY enquiry_status_log.enquiry_number
ORDER BY enquiry_status_log.enquiry_log_number DESC)
rn
FROM enquiry_status_log
JOIN follow_up
ON enquiry_status_log.follow_up_code =
follow_up.follow_up_code)
SELECT enquiry_number,
enquiry_log_number,
follow_up_name,
follow_up_date
FROM table1
WHERE rn = 1
ORDER BY enquiry_number, enquiry_log_number
我该如何写这个(拜托,非常容易理解)以便 SELECT 成为代码中的第一个词并且不使用 CTE?
您的 CTE 在您的查询中只使用一次,因此您可以简单地将其转换为子查询:
SELECT enquiry_number,
enquiry_log_number,
follow_up_name,
follow_up_date
FROM (
SELECT
e.enquiry_number,
e.enquiry_log_number,
f.follow_up_name,
e.follow_up_date,
RANK () OVER (
PARTITION BY e.enquiry_number
ORDER BY e.enquiry_log_number DESC
) rn
FROM enquiry_status_log e
JOIN follow_up f ON e.follow_up_code = f.follow_up_code
) table1
WHERE rn = 1
ORDER BY enquiry_number, enquiry_log_number
注意:table 别名使查询更短且更易于阅读。我修改了您的查询以使用它们。
此外,可能 您的查询可以重写为使用相关子查询而不是 rank()
进行过滤。在 Oracle 中,这可能会带来更好的性能:
SELECT
e.enquiry_number,
e.enquiry_log_number,
f.follow_up_name,
e.follow_up_date
FROM enquiry_status_log e
JOIN follow_up f ON e.follow_up_code = f.follow_up_code
WHERE e.enquiry_log_number = (
SELECT MAX(enquiry_log_number)
FROM enquiry_status_log e1
WHERE e.enquiry_number = e1.enquiry_number
)
ORDER BY e.enquiry_number, e.enquiry_log_number
我的系统不允许在编码中使用 CTE,第一个词必须始终是 SELECT。
有人可以解释一下(最好是 Oracle SQL 虚拟格式)我将如何将使用 CTE 编写的代码更改为 INLINE 代码吗?
以CTE代码为例:
WITH table1
AS (SELECT enquiry_status_log.enquiry_number,
enquiry_status_log.enquiry_log_number,
follow_up.follow_up_name,
enquiry_status_log.follow_up_date,
RANK ()
OVER (PARTITION BY enquiry_status_log.enquiry_number
ORDER BY enquiry_status_log.enquiry_log_number DESC)
rn
FROM enquiry_status_log
JOIN follow_up
ON enquiry_status_log.follow_up_code =
follow_up.follow_up_code)
SELECT enquiry_number,
enquiry_log_number,
follow_up_name,
follow_up_date
FROM table1
WHERE rn = 1
ORDER BY enquiry_number, enquiry_log_number
我该如何写这个(拜托,非常容易理解)以便 SELECT 成为代码中的第一个词并且不使用 CTE?
您的 CTE 在您的查询中只使用一次,因此您可以简单地将其转换为子查询:
SELECT enquiry_number,
enquiry_log_number,
follow_up_name,
follow_up_date
FROM (
SELECT
e.enquiry_number,
e.enquiry_log_number,
f.follow_up_name,
e.follow_up_date,
RANK () OVER (
PARTITION BY e.enquiry_number
ORDER BY e.enquiry_log_number DESC
) rn
FROM enquiry_status_log e
JOIN follow_up f ON e.follow_up_code = f.follow_up_code
) table1
WHERE rn = 1
ORDER BY enquiry_number, enquiry_log_number
注意:table 别名使查询更短且更易于阅读。我修改了您的查询以使用它们。
此外,可能 您的查询可以重写为使用相关子查询而不是 rank()
进行过滤。在 Oracle 中,这可能会带来更好的性能:
SELECT
e.enquiry_number,
e.enquiry_log_number,
f.follow_up_name,
e.follow_up_date
FROM enquiry_status_log e
JOIN follow_up f ON e.follow_up_code = f.follow_up_code
WHERE e.enquiry_log_number = (
SELECT MAX(enquiry_log_number)
FROM enquiry_status_log e1
WHERE e.enquiry_number = e1.enquiry_number
)
ORDER BY e.enquiry_number, e.enquiry_log_number