2017-03-02 46 views
0

当我运行以下查询:这不是当子查询跟随允许=,=,<, <= , >,> =当我使用子查询

SELECT 
    CASE 
     WHEN AT_EMPSCHEDULE.START1 <> '01/01/1900' 
      AND AT_EMPSCHEDULE.START2 <> '01/01/1900' 
      AND AT_EMPSCHEDULE.END2 <> '01/01/1900' 
      AND AT_EMPSCHEDULE.LEAVECODE ='' 
      AND NOT EXISTS(SELECT PDATE 
          FROM HR_PUBHOLIDAY 
          WHERE PDATE=AT_EMPSCHEDULE.TRANDATE) 
      AND DATEPART(WEEKDAY,AT_EMPSCHEDULE.TRANDATE) <> 1 
      THEN 
      CAST((SELECT HIS_GENSALARYD.BASESALARY/HIS_GENSALARYD.WORKDAY 
        FROM HIS_GENSALARYD 
        WHERE (AT_EMPSCHEDULE.TRANDATE BETWEEN HIS_GENSALARYD.PAYFROM 
                AND HIS_GENSALARYD.PAYTO 
        AND HIS_GENSALARYD.EMPCODE = AT_EMPSCHEDULE.EMPCODE)) AS DECIMAL(10, 2)) 
      ELSE 0 
    END AS DAILYSALARY 
FROM 
    HIS_GENSALARY 
INNER JOIN 
    AT_EMPSCHEDULE ON HIS_GENSALARY.EMPCODE = AT_EMPSCHEDULE.EMPCODE 
        AND MONTH(TRANDATE) = HIS_GENSALARY.INMONTH 
        AND YEAR(TRANDATE) = HIS_GENSALARY.INYEAR 
WHERE 
    HIS_GENSALARY.EMPCODE = HIS_GENSALARY.EMPCODE 

我得到的消息:

子查询返回了超过1个值。当子查询遵循=,!=,<,< =,>,> =或当子查询用作表达式时,这是不允许的。

+2

在上下文中,子查询最多可以返回一行。 SQL Server正在期待一个标量值。单一的价值。不是结果集,观察到的行为是预期的,并与记录的行为一致。有*问题*吗?也许您想要返回单个值,例如,使用AVG之类的聚合函数?我们只是猜测。 – spencer7593

回答

0

的问题是在这里:

(SELECT HIS_GENSALARYD.BASESALARY/HIS_GENSALARYD.WORKDAY 
FROM HIS_GENSALARYD 
WHERE AT_EMPSCHEDULE.TRANDATE BETWEEN HIS_GENSALARYD.PAYFROM 
    AND HIS_GENSALARYD.PAYTO 
AND HIS_GENSALARYD.EMPCODE = AT_EMPSCHEDULE.EMPCODE) 

您已经用作表达式。根据错误消息,它必须只有有效产生一个结果在哪里使用过它;即它绝不能返回多于一行,但至少有一次调用返回了多行。

要强制它只返回一行,应用聚合函数;一个明显的选择是max()

(SELECT MAX(HIS_GENSALARYD.BASESALARY/HIS_GENSALARYD.WORKDAY) 
FROM HIS_GENSALARYD 
WHERE AT_EMPSCHEDULE.TRANDATE BETWEEN HIS_GENSALARYD.PAYFROM 
    AND HIS_GENSALARYD.PAYTO 
AND HIS_GENSALARYD.EMPCODE = AT_EMPSCHEDULE.EMPCODE) 
相关问题