Sql ORA-00913:“值太多”。我不确定应该在哪里找到函数和子查询

Sql ORA-00913:“值太多”。我不确定应该在哪里找到函数和子查询,sql,database,oracle,Sql,Database,Oracle,我应该在结果中看到以下列:作业id、位置id、位置名称、销售类别id、销售类别描述、作业承诺日期的时间id、上次装运日期的时间id、作业中的订单数量、作业承诺日期后的装运数量之和,最后装运日期和承诺日期之间的营业日差异 但我认为这个错误ORA-00913:太多的值。 我不确定我应该在哪里找到函数和子查询!! 我将在下面分享我的查询和我的功能。 事先非常感谢你的帮助 注:X1别名的功能和选择查询正常 ' Select Location_Id, Location_Name, Sales_Class

我应该在结果中看到以下列:作业id、位置id、位置名称、销售类别id、销售类别描述、作业承诺日期的时间id、上次装运日期的时间id、作业中的订单数量、作业承诺日期后的装运数量之和,最后装运日期和承诺日期之间的营业日差异

但我认为这个错误ORA-00913:太多的值。 我不确定我应该在哪里找到函数和子查询!! 我将在下面分享我的查询和我的功能。 事先非常感谢你的帮助

注:X1别名的功能和选择查询正常

'

 Select
Location_Id,
Location_Name,
Sales_Class_Id,
Sales_Class_Desc,
Date_Promised,
x1,
Busdaysdiff
 from (
   
Select  Loc.Location_Id, Loc.Location_Name, Sclass.Sales_Class_Id,
Sclass.Sales_Class_Desc, J.Date_Promised , (SELECT W_SUB_JOB_F.JOB_ID,
    MAX(actual_ship_Date)   AS Last_Shipment_Date,
    SUM ( actual_Quantity ) AS SumDelayShipQty
   FROM W_JOB_SHIPMENT_F, W_SUB_JOB_F, W_Job_F
   WHERE W_SUB_JOB_F.SUB_JOB_ID = W_JOB_SHIPMENT_F.SUB_JOB_ID
     AND W_Job_F.Job_Id = W_SUB_JOB_F.JOB_ID
     And Actual_Ship_Date > Date_Promised
   Group By W_Sub_Job_F.Job_Id ) as X1,
    Getbusdaysdiff(J.Date_Ship_By, J.Contract_Date) As Busdaysdiff
   From W_Job_Shipment_F Ship, W_Sub_Job_F Subj, W_Job_F J,W_Location_D Loc, 
W_Invoiceline_F Invo, W_Sales_Class_D Sclass, W_Time_D T
    WHERE subj.SUB_JOB_ID = ship.SUB_JOB_ID
     And J.Job_Id = Subj.Job_Id
     And Ship.Actual_Ship_Date > J.Date_Promised
     Group By Loc.Location_Id, Loc.Location_Name, Sclass.Sales_Class_Id,
Sclass.Sales_Class_Desc, J.Date_Promised
);

**function:

create or replace function getBusDaysDiff
(
-- Time_Id parameters
time_ID1 number,
time_ID2 number
-- time_id1 must be greater than time_id2
)
return number
IS

v_timne_ID1 integer;
v_timne_ID2 integer;
transTimeID integer;
difference integer;

Begin

v_timne_ID1 := time_ID1;
v_timne_ID2 := time_ID2;

if ( v_timne_ID1 = v_timne_ID2 ) then
return 0;
elsif ( v_timne_ID1 > v_timne_ID2 ) then 
transTimeID := v_timne_ID1;
v_timne_ID1 := v_timne_ID2;
v_timne_ID2 := transTimeID;
end if;

  execute immediate ' select count(*) from w_time_D where time_ID <= ' ||  v_timne_ID2 ||' and time_ID > ' || v_timne_ID1 into difference  ;

  if ( difference = '' or difference is null )then
    raise_application_error(-20011, ' An error occurred calculating the difference');
  else
    return  difference ;
  end if;
END;

子查询必须只返回一个值,而不是像您这样的一堆值。这个:

(SELECT W_SUB_JOB_F.JOB_ID,
    MAX(actual_ship_Date)   AS Last_Shipment_Date,
    SUM ( actual_Quantity ) AS SumDelayShipQty
   FROM W_JOB_SHIPMENT_F, W_SUB_JOB_F, W_Job_F
   WHERE W_SUB_JOB_F.SUB_JOB_ID = W_JOB_SHIPMENT_F.SUB_JOB_ID
     AND W_Job_F.Job_Id = W_SUB_JOB_F.JOB_ID
     And Actual_Ship_Date > Date_Promised
   Group By W_Sub_Job_F.Job_Id )
说明:

SQL> select deptno, (select empno, ename from emp where rownum = 1)  --> selects 2 columns (EMPNO, ENAME)
  2  from emp ;
select deptno, (select empno, ename from emp where rownum = 1)
                *
ERROR at line 1:
ORA-00913: too many values


SQL> select deptno, (select empno from emp where rownum = 1)        --> selects 1 column (EMPNO)
  2  from emp ;

    DEPTNO (SELECTEMPNOFROMEMPWHEREROWNUM=1)
---------- ---------------------------------
        20                              7369
        30                              7369
        <snip>

也许您应该将这两个表正确地连接到主查询中的其余表。

为什么选择不使用正确、明确、标准、可读的连接语法?我不知道确切原因,可以说我不习惯。这对sql专家或dba来说太重要了吗?如有必要,我可以更改我的方法。@dwh\u asil:逗号分隔的联接,例如从w\u作业\u装运\u f、w\u子作业\u f与显式联接(例如从w\u作业\u装运\u f内部联接w\u子作业\u f)相比,可读性较差且更容易出错。。。这是1992年发明的。现在人们不应该再使用那种旧的逗号语法了。由于上述原因,它被认为是不好的风格。@dwh\u asil。我想补充一点,在这样一个论坛上,它可能会阻止一些人回答,因为任何能提供帮助的人都可以先重写你的问题。我将尝试编写连接脚本。谢谢你的支持和建议。谢谢你的帮助。但它是单独起作用的。该查询生成3列,并按预期进行响应。你认为,这是主要问题吗?那么,如果它单独起作用呢?你不再单独使用它了,所以。。。没有用。它只能返回一个值或根本不返回任何值,但不能返回多个列或多个行。。
SQL> select deptno, (select empno, ename from emp where rownum = 1)  --> selects 2 columns (EMPNO, ENAME)
  2  from emp ;
select deptno, (select empno, ename from emp where rownum = 1)
                *
ERROR at line 1:
ORA-00913: too many values


SQL> select deptno, (select empno from emp where rownum = 1)        --> selects 1 column (EMPNO)
  2  from emp ;

    DEPTNO (SELECTEMPNOFROMEMPWHEREROWNUM=1)
---------- ---------------------------------
        20                              7369
        30                              7369
        <snip>