2017-10-04 97 views
0

我们正在尝试构建一个查询,以筛选出标识为SuspendedInactive(这些值字符串显示在我们的数据表中'status列'中)的雇员。如果员工具有以上任一状态,他们将显示在On Hold数据表中,而不是Fail数据表中。MySQL查询复合语句不返回预期结果

在下面的情况下,“李四”做失败了Approval,而是因为她是Inactive她应该被处理为On Hold并没有出现在Fail数据表。

我们预计这些结果在Fail表当我们运行下面的查询:

Employee ID FirstName LastName Status Eligibility Approved 
    123456  Jim  James  OK   OK  Not Approved 
    777889  Ray  Raymond OK   Ineligible  OK 

但是相反,我们看到:

Employee ID FirstName LastName Status Eligibility Approved 
    123456  Jim  James  OK   OK  Not Approved 
    123412  Jane  Doe  Inactive  OK  Not Approved 
    777889  Ray  Raymond OK  Ineligible  OK 

下面是我们运行查询,但Inactive员工继续尽管出现了第一个复合语句(我们在此数据运行中没有任何Suspended雇员,如果这有所作为),也会出现。

SELECT 
    emp_id, 
    first_name, 
    last_name, 
    status, 
    eligibility, 
    approved 
FROM 
    `pass_fail` 
WHERE(
     status <> 'Inactive' 
OR 
     status <> 'Suspended' 
) 
AND (
     eligibility ='Ineligible' 
OR 
    approved = 'Not Approved') 

回答

0

更改或和两个状态条件

之间
SELECT emp_id, first_name, last_name, status, eligibility, approved 
FROM `pass_fail` 
WHERE status <> 'Inactive' 
    AND status <> 'Suspended' 
    AND (eligibility ='Ineligible' OR approved = 'Not Approved') 
1

我会用innot in。按照你的逻辑,查询将是:

SELECT emp_id, first_name, last_name, status, eligibility, approved 
FROM pass_fail 
WHERE status NOT IN ('Inactive', 'Suspended'); 

您的文字不介绍如何eligibilityapproved都应该使用。但我推测:

SELECT emp_id, first_name, last_name, status, eligibility, approved 
FROM pass_fail 
WHERE status NOT IN ('Inactive', 'Suspended') AND 
     (eligibility = 'Ineligible' OR approved = 'Not Approved'); 
+0

谢谢戈登!我们测试了您的解决方案并且效果很好。汤姆 – tomish