1

我有选择案例的问题..

桌子

  1. 模板(temp_id、temp_title、temp_applyto、temp_status、start_date、end_date)

    [其中 temp_applyto 存储 int 1-individu、2-branch、3-dept 和 4-position]

  2. 个人(applyto_id,applyto_individu,applyto_temp)

  3. 分支(applyto_id、applyto_branch、applyto_temp)

  4. 部门(applyto_id、applyto_dept、applyto_temp)

  5. 位置(applyto_id、applyto_position、applyto_temp)

  6. 员工(身份证、姓名、分公司、部门、职位)

描述:

我想检查用户是否在个人、分支、部门或职位中。如果temp_applyto(表模板)=1,那么我想检查用户是否存在,如果temp_applyto =2 ,那么我想检查表分支,如果用户存在并且同样的情况继续。

到目前为止的查询:

SELECT (CASE WHEN temp_applyto=1 
    THEN (SELECT applyto_temp FROM individu 
          WHERE applyto_individu=$user)
    WHEN temp_applyto=2 
    THEN (SELECT a.applyto_temp FROM branch a, staff b 
          WHERE >a.applyto_branch=b.branch AND b.id=$user) 
    WHEN temp_applyto=3 
    THEN (SELECT a.applyto_temp FROM dept a, staff b 
          WHERE >a.applyto_dept=b.dept AND b.id=$user) 
    WHEN temp_applyto=4 THEN (SELECT a.applyto_temp FROM position a, staff b 
          WHERE a.applyto_position=b.position AND b.id=$user) 
    ELSE 0 end) as template_temp 
FROM template 
WHERE '2013-08-21' BETWEEN start_date AND end_date

我得到这个错误:子查询返回超过 1 行

4

2 回答 2

0

该错误是不言自明的:您的子查询之一返回不止一行。有几种方法可以解决您的问题。一个简单的方法是添加LIMIT 1到每个子选择中。或者,您可以选择行数 - 然后将结果与 0 进行比较:

SELECT (CASE WHEN temp_applyto=1 
    THEN (SELECT COUNT(*) FROM individu 
          WHERE applyto_individu=$user)
    WHEN temp_applyto=2 
    THEN (SELECT COUNT(*) FROM branch a, staff b 
          WHERE >a.applyto_branch=b.branch AND b.id=$user)
    WHEN temp_applyto=3 
    THEN (SELECT COUNT(*) FROM dept a, staff b 
          WHERE >a.applyto_dept=b.dept AND b.id=$user) 
    WHEN temp_applyto=4
    THEN (SELECT COUNT(*) FROM position a, staff b 
          WHERE a.applyto_position=b.position AND b.id=$user)
    ELSE 0 END) as template_temp 
FROM template
WHERE '2013-08-21' BETWEEN start_date AND end_date

这将返回一个数字 - 如果没有匹配项,则返回 0,如果有,则返回匹配项数。

于 2013-08-21T08:43:05.743 回答
0

错误很明显,因为我们的子查询之一返回不止一行。您可以LIMIT 1在每个子查询上使用。但是,如果您想获得不止一行,则可以UNION像这样使用

SELECT template_temp FROM
(
    (SELECT applyto_temp AS template_temp, 1 AS temp_applyto FROM individu WHERE applyto_individu = $user) UNION
    (SELECT a.applyto_temp AS template_temp, 2 AS temp_applyto FROM branch a, staff b WHERE a.applyto_branch=b.branch AND b.id=$user) UNION
    (SELECT a.applyto_temp AS template_temp, 3 AS temp_applyto FROM dept a, staff b WHERE a.applyto_dept=b.dept AND b.id=$user) UNION
    (SELECT a.applyto_temp AS template_temp, 4 AS temp_applyto FROM `position` a, staff b WHERE a.applyto_position=b.`position` AND b.id=$user)
) AS combine INNER JOIN template
ON (combine.temp_applyto = template.temp_applyto)
WHERE '2013-08-21' BETWEEN start_date AND end_date
于 2013-08-21T08:37:29.447 回答