子查询返回的值大于1

时间:2018-08-01 18:59:58

标签: sql sql-server

我有一个很大的查询,但是知道问题出在这部分,因为当我添加更多行然后使用相同的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_fileend_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

2 个答案:

答案 0 :(得分:1)

我认为您需要编写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

答案 1 :(得分:0)

  

如果任何记录start_file和end_file在今天的   日期,应返回1。

在这种情况下,您应该使用IF EXISTS()而不是IIF来检查具有该日期过滤器的该雇员是否存在任何行。