Oracle 中的列连接

Column Concatenation in Oracle

我正在尝试将这三列连接成一列,但出现错误,有什么帮助吗?

 WITH ABC AS
    (select tsk.task_number || ' / '|| tsk.task_status|| ' / '|| tsk.summary,
            CSI.creation_date AS creation_date
    FROM csf_ct_task_assignments tsa,CSF_DEBRIEF_HEADERS db, csf_ct_tasks tsk ,CSI_ITEM_INSTANCES csi
    where 1=1
    and tsk.customer_product_id = csi.instance_id 
    and tsk.INCIDENT_CUSTOMER_ID = csi.OWNER_PARTY_ID
    and tsa.Task_Assignment_Id=db.Task_Assignment_Id(+)
    and tsk.task_id = tsa.task_id (+)
    and tsk.task_type like '%Termination%'
    and tsk.task_status_id<>7
    and (SELECT  actual_shipment_date
    FROM oe_order_lines_all
    WHERE line_id= csi.last_oe_order_line_id)
    <= tsk.creation_date
    and rownum=1
    ) AS termination_call_dtls,

[错误]: Execution (14: 74): ORA-00936: missing expression

您的查询中的串联没有问题。

您需要将 WITHSELECT 一起使用,如下所示:

WITH ABC AS (
    SELECT
        TSK.TASK_NUMBER
        || ' / '
        || TSK.TASK_STATUS
        || ' / '
        || TSK.SUMMARY as termination_call_dtls,
        CSI.CREATION_DATE   AS CREATION_DATE
    FROM
        CSF_CT_TASK_ASSIGNMENTS TSA,
        CSF_DEBRIEF_HEADERS DB,
        CSF_CT_TASKS TSK,
        CSI_ITEM_INSTANCES CSI
    WHERE
        1 = 1
        AND TSK.CUSTOMER_PRODUCT_ID = CSI.INSTANCE_ID
        AND TSK.INCIDENT_CUSTOMER_ID = CSI.OWNER_PARTY_ID
        AND TSA.TASK_ASSIGNMENT_ID = DB.TASK_ASSIGNMENT_ID (+)
        AND TSK.TASK_ID = TSA.TASK_ID (+)
        AND TSK.TASK_TYPE LIKE '%Termination%'
        AND TSK.TASK_STATUS_ID <> 7
        AND (
            SELECT
                ACTUAL_SHIPMENT_DATE
            FROM
                OE_ORDER_LINES_ALL
            WHERE
                LINE_ID = CSI.LAST_OE_ORDER_LINE_ID
        ) <= TSK.CREATION_DATE
        AND ROWNUM = 1
)
-- YOU ARE MISSING FOLLOWING SELECT STATEMENT
SELECT
    *
FROM
    ABC;

干杯!!

but i want to concatenate those columns in termination_call_dtls!!

正如@APC 提到的,问题在于您试图为 WITH 块设置别名。不清楚您是否需要在这里进行子查询分解;你可以这样做:

select tsk.task_number || ' / '|| tsk.task_status|| ' / '|| tsk.summary AS termination_call_dtls,
  CSI.creation_date AS creation_date
FROM csf_ct_task_assignments tsa,CSF_DEBRIEF_HEADERS db, csf_ct_tasks tsk ,CSI_ITEM_INSTANCES csi
where 1=1
and tsk.customer_product_id = csi.instance_id 
and tsk.INCIDENT_CUSTOMER_ID = csi.OWNER_PARTY_ID
and tsa.Task_Assignment_Id=db.Task_Assignment_Id(+)
and tsk.task_id = tsa.task_id (+)
and tsk.task_type like '%Termination%'
and tsk.task_status_id<>7
and (SELECT  actual_shipment_date
FROM oe_order_lines_all
WHERE line_id= csi.last_oe_order_line_id)
<= tsk.creation_date
and rownum=1

termination_call_dtls 作为第一行的 别名。

正如评论中还提到的,您应该考虑使用现代连接语法,而不是您现在拥有的旧的和仅限 Oracle 的语法;并且子查询作为另一个连接可能会更好,例如:

select tsk.task_number || ' / '|| tsk.task_status|| ' / '|| tsk.summary as termination_call_dtls,
  csi.creation_date
from csf_ct_tasks tsk
join csi_item_instances csi on csi.instance_id = tsk.customer_product_id
and csi.owner_party_id = tsk.incident_customer_id
join oe_order_lines_all oola on oola.line_id = csi.last_oe_order_line_id
and ools.actual_shipment_date <= tsk.creation_date
left join csf_ct_task_assignments tsa on tsa.task_id = tsk.task_id
left join csf_debrief_headers db on db.task_assignment_id = tsa.task_assignment_id
where tsk.task_type like '%Termination%'
and tsk.task_status_id != 7
and rownum = 1

无论哪种方式,如果需要,您仍然可以将查询用作 CTE - 如果它是比您显示的更大、更复杂的查询的一部分。

尚不清楚为什么要对 csf_ct_task_assignmentscsf_debrief_headers 进行(外部)联接,因为无论如何您都不使用这些表中的任何列。这些连接可能只是被删除。

您还应该知道 and rownum = 1 会给您返回一个不确定的行,假设您得到多行而没有它。通常你会有一个包含 order by 子句的内联视图,然后在之后应用 rownum 过滤器来限制结果,例如(猜你想要最早的创建日期):

select termination_call_dtls, creation_date
from (
  select tsk.task_number || ' / '|| tsk.task_status|| ' / '|| tsk.summary as termination_call_dtls,
    csi.creation_date
  from csf_ct_tasks tsk
  join csi_item_instances csi on csi.instance_id = tsk.customer_product_id
  and csi.owner_party_id = tsk.incident_customer_id
  join oe_order_lines_all oola on oola.line_id = csi.last_oe_order_line_id
  and ools.actual_shipment_date <= tsk.creation_date
  where tsk.task_type like '%Termination%'
  and tsk.task_status_id != 7
  order by csi.creation_date
)
where rownum = 1

从 12c 开始,有其他机制可以稍微简化一下。或者使用聚合:

select tsk.task_number || ' / '|| tsk.task_status|| ' / '|| tsk.summary as termination_call_dtls,
  min(csi.creation_date) as creation_date
from csf_ct_tasks tsk
join csi_item_instances csi on csi.instance_id = tsk.customer_product_id
and csi.owner_party_id = tsk.incident_customer_id
join oe_order_lines_all oola on oola.line_id = csi.last_oe_order_line_id
and ools.actual_shipment_date <= tsk.creation_date
where tsk.task_type like '%Termination%'
and tsk.task_status_id != 7
group by tsk.task_number, tsk.task_status, tsk.summary