Sql 返回多行的子查询
我在下面的查询中得到一个错误。。有人能帮忙解决这个问题吗Sql 返回多行的子查询,sql,oracle,oracle-agile-plm,Sql,Oracle,Oracle Agile Plm,我在下面的查询中得到一个错误。。有人能帮忙解决这个问题吗 select c.CHANGE_NUMBER, (select le.ENTRYVALUE from listentry le where le.ENTRYID = c.CATEGORY)as CATEGORY , ( SELECT last_name || ',' || first_name || '(' || loginid || ')' FROM agileuser
select c.CHANGE_NUMBER,
(select le.ENTRYVALUE from listentry le
where le.ENTRYID = c.CATEGORY)as CATEGORY ,
(
SELECT last_name || ',' || first_name || '(' || loginid || ')'
FROM agileuser
WHERE id = c.ORIGINATOR
) initiator,(
SELECT last_name || ',' || first_name || '(' || loginid || ')'
FROM agileuser
WHERE id = c.owner
) coordinator, w.state,
(SELECT description
FROM nodetable
WHERE id = w.state
) workflow_status , TO_CHAR(w.LOCAL_DATE,'DD-MON-YY HH24:MI:SS')local_date,
(select
(trunc(to_date(B.local_date, 'DD-MON-YY HH24:MI:SS') - to_date(w.local_date, 'DD-MON-YY HH24:MI:SS')))as timediff
FROM WORKFLOW_PROCESS w INNER JOIN WORKFLOW_PROCESS B ON B.order_by = (w.order_by + 1)
where w.change_id=B.Change_id and w.change_id=9946301 )--ORDER BY w.order_by ASC
from change c, WORKFLOW_PROCESS w
where w.change_id = c.id-- order by w.ORDER_BY)
and c.CHANGE_NUMBER='NPI001084'
order by w.ORDER_BY,local_date ASC
trunc()查询提供多条记录
select
(trunc(to_date(B.local_date, 'DD-MON-YY HH24:MI:SS') - to_date(w.local_date, 'DD-MON-YY HH24:MI:SS')))as timediff
FROM WORKFLOW_PROCESS w INNER JOIN WORKFLOW_PROCESS B ON B.order_by = (w.order_by + 1)
where w.change_id=B.Change_id and w.change_id=9946301 ORDER BY w.order_by ASC
因此无法执行此主查询。真是一团糟!您确实应该考虑使用SQL格式化程序,或者如果由于某种原因不能使用,请尝试手动编写代码格式。这是不可读的 无论如何:尽管子查询看起来是解决问题的好方法,但通常-避免它们。其中大部分都可以重写,以便正确地联接相关的表 如果选择在
SELECT
语句中使用它们,则必须确保它们每个都返回一个值
这将返回两行或更多行:
SELECT (TRUNC (
TO_DATE (b.local_date, 'DD-MON-YY HH24:MI:SS')
- TO_DATE (w.local_date, 'DD-MON-YY HH24:MI:SS')))
AS timediff
FROM workflow_process w
INNER JOIN workflow_process b ON b.order_by = (w.order_by + 1)
WHERE w.change_id = b.change_id
AND w.change_id = 9946301
如何修复它?我不知道,我没有你的桌子,也不知道你想要什么。简单的选择可能是:
select distinct timediff ...
或
或
或者其他一些选项,但是-同样,这取决于我们不知道的东西。完全未经测试,可能有一些拼写错误,也可能是应该保留的连接,可能是不正确的oracle语法,但是
select c.CHANGE_NUMBER,
le.ENTRYVALUE as CATEGORY
orig.last_name || ',' || orig.first_name || '(' || orig.loginid || ')' as initiator,
own.last_name || ',' || own.first_name || '(' || own.loginid || ')' as coordinator,
w.state,
n.description as workflow_status,
TO_CHAR(w.LOCAL_DATE,'DD-MON-YY HH24:MI:SS')local_date,
trunc(to_date(B.local_date, 'DD-MON-YY HH24:MI:SS') - to_date(w.local_date, 'DD-MON-YY HH24:MI:SS')) as timediff
from change c
join WORKFLOW_PROCESS w on w.change_id = c.id
join listentry le on le.ENTRYID = c.CATEGORY
join agileuser as orig on orig.id = c.ORIGINATOR
join agileuser as own on own.id = c.owner
join nodetable as n on n.id = w.state
JOIN WORKFLOW_PROCESS B ON B.order_by = (w.order_by + 1)
where c.CHANGE_NUMBER='NPI001084'
order by w.ORDER_BY,local_date ASC
非常感谢你们两位。我对它完全陌生,并试图弄明白。在添加子查询之前,上面的查询为我提供了预期的结果。这个查询多次打印相同的行,我不能在任何列中使用distinct。有什么建议吗?同一行多次是您问题的根源。只需优化查询以仅选择一个,或者使用row_number()函数选择任何组中的第一个。或者,如果它们在所有这些列中确实是重复的,则使用SELECT DISTINCT。
select ...
where rownum = 1
select c.CHANGE_NUMBER,
le.ENTRYVALUE as CATEGORY
orig.last_name || ',' || orig.first_name || '(' || orig.loginid || ')' as initiator,
own.last_name || ',' || own.first_name || '(' || own.loginid || ')' as coordinator,
w.state,
n.description as workflow_status,
TO_CHAR(w.LOCAL_DATE,'DD-MON-YY HH24:MI:SS')local_date,
trunc(to_date(B.local_date, 'DD-MON-YY HH24:MI:SS') - to_date(w.local_date, 'DD-MON-YY HH24:MI:SS')) as timediff
from change c
join WORKFLOW_PROCESS w on w.change_id = c.id
join listentry le on le.ENTRYID = c.CATEGORY
join agileuser as orig on orig.id = c.ORIGINATOR
join agileuser as own on own.id = c.owner
join nodetable as n on n.id = w.state
JOIN WORKFLOW_PROCESS B ON B.order_by = (w.order_by + 1)
where c.CHANGE_NUMBER='NPI001084'
order by w.ORDER_BY,local_date ASC