首页 > 解决方案 > 子查询返回超过 1 个值

问题描述

我有一个很大的查询,但知道问题出在这部分,因为当我添加了更多具有相同 mat_emp 的行时,我开始在我的程序中收到错误:

 ISNULL((SELECT  IIF( getdate() between  start_file and end_file, CAST(1 AS BIT),CAST(0 AS BIT)) from Xtable where mat_emp = E.mat_emp),0) as bool_value

使用 TOP 不是一个选项,因为我想浏览所有记录,但我无法理解IN在这种情况下如何使用。

如果用户在 中有记录XTable,它将检查getdate是否在start_file和之间end_file。如果是这种情况,它应该返回 1,如果不是,它应该返回 0。我正在使用ISNULL,因为如果用户在那里没有记录,它也应该返回 0。

完整的查询:

SELECT MAT_EMP
    , Prenom_EMP
    , NOM_EMP
    , CODE_STR
    , ISNULL((SELECT PRENOM_EMP + ' ' + NOM_EMP from EMPLOYE where MAT_EMP = E.EMP_MAT_EMP),'Aucun') as Responsable
    , ISNULL(E.EMP_MAT_EMP,0) as EMP_MAT_EMP
    , (SELECT IS_ACTIVATED from USERS where USER_ID = E.USER_ID) as is_activated
    , ISNULL(USER_ID,0) as USER_ID
    , E.CODE_FONC
    , F.NOM_FONC
    , DN_EMP
    , TEL_EMP
    , DATE_RECRUTEMENT_EMP
    , ISNULL((SELECT  IIF( getdate() between  dc_debut and dc_fin, CAST(1 AS BIT),CAST(0 AS BIT)) from demande_conge where mat_emp = E.mat_emp),0) as is_on_vacation  
from EMPLOYE E 
INNER JOIN FONCTION F ON E.CODE_FONC = F.CODE_FONC

标签: sqlsql-server

解决方案


我认为您需要编写LEFT JOIN而不是子查询。并CASE WHEN用来写条件。

SELECT mat_emp, 
       prenom_emp, 
       nom_emp, 
       code_str, 
       Isnull((SELECT prenom_emp + ' ' + nom_emp 
               FROM   employe 
               WHERE  mat_emp = E.emp_mat_emp), 'Aucun') AS Responsable, 
       Isnull(E.emp_mat_emp, 0)                          AS EMP_MAT_EMP, 
       (SELECT is_activated 
        FROM   users 
        WHERE  user_id = E.user_id)                      AS is_activated, 
       Isnull(user_id, 0)                                AS USER_ID, 
       E.code_fonc, 
       F.nom_fonc, 
       dn_emp, 
       tel_emp, 
       date_recrutement_emp, 
       Isnull(CASE WHEN Getdate() BETWEEN d.dc_debut AND d.dc_fin THEN 1 ELSE 0 END,0) AS is_on_vacation
FROM   employe E 
       INNER JOIN fonction F 
               ON E.code_fonc = F.code_fonc 
        LEFT JOIN 
        demande_conge d ON d.mat_emp = E.mat_emp

推荐阅读