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
您的查询中的串联没有问题。
您需要将 WITH
与 SELECT
一起使用,如下所示:
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_assignments
或 csf_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
我正在尝试将这三列连接成一列,但出现错误,有什么帮助吗?
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
您的查询中的串联没有问题。
您需要将 WITH
与 SELECT
一起使用,如下所示:
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_assignments
或 csf_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