如何将 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