我有一个很大的查询,但是知道问题出在这部分,因为当我添加更多行然后使用相同的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
答案 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
来检查具有该日期过滤器的该雇员是否存在任何行。