sql - 子查询返回超过 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
解决方案
我认为您需要编写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
推荐阅读
- javascript - Javascript如何识别单击的按钮
- matlab - 通过MATLAB图中的数据点绘制平滑线
- java - 以双格式获取日期 43318.4847916667 而不是 06-08-2018 11:38:06
- excel - 在 VBA 中嵌套 If
- r - 如果我指定的列值以“1”开头,如何删除整行
- mysql - 404 Not Found:源服务器没有找到目标资源的当前表示或不愿意透露存在的表示
- php - 如何使用 PHP 屏蔽文件的云 URL?
- python - Python tkinter 应用程序在 0 错误时运行时没有响应?
- ios - iOS 文件模式:`source_files` 模式与任何文件都不匹配
- google-app-engine - 托管 google 应用引擎中的一个应用程序,用于在特定时间工作