2011-12-09 96 views
2

我有一个现有的SQL查询在SQL Server中正常工作,我想在MySQL中工作。我把它清理了一下,用列表/表格名称等的后退标记来摆弄,但无法使其工作。mySQL中的嵌套select语句

这里是有问题的声明:

SELECT `EmployeeID` 
FROM `Employee` 
WHERE 
(
    (
     SELECT COUNT(*) AS A 
     FROM `TimeClock` 
     WHERE (`EmployeeID` = `Employee.EmployeeID`) 
     AND (`InOut` = 'True') 
    ) > (
     SELECT COUNT(*) AS B 
     FROM `TimeClock` AS `TimeClock_1` 
     WHERE (`EmployeeID` = `Employee.EmployeeID`) 
     AND (`InOut` = 'False') 
    ) 
) 

这应该返回必须在TimeClock表的详细InOut = True超过InOut = False任何EmployeeID的。

谢谢。

+1

你得到的错误是什么? – Zohaib

+0

Error'Unknown column'Employee.EmployeeID'in'where clause'' – Fuginator

回答

1

这应该为您提供那里是InOut真不是假

SELECT e.EmployeeId 
FROM Employee AS e 
INNER JOIN 
(
    SELECT tc.EmployeeID 
     , SUM(CASE 
       WHEN tc.InOut = 1 THEN 1 ELSE 0 
      END) AS InOutTrue 
     , SUM(CASE 
       WHEN tc.InOut = 0 THEN 1 ELSE 0 
      END) AS InOutFalse 
    FROM TimeClock AS tc 
    GROUP BY tc.EmployeeId 
) AS t ON e.EmployeeId = t.EmployeeId 
WHERE t.InOutTrue > t.InOutFalse 

我在我的很小没有索引的测试数据显示出类似的性能提出了两个备选方案更值EmployeeId值。我建议你根据自己的数据对它们进行测试,看看它们是否有任何区别:

这一个是几乎相同,但使用总记录数而不是InOutFalse。

SELECT e.EmployeeId 
FROM Employee AS e 
INNER JOIN 
(
    SELECT tc.EmployeeID 
     , COUNT(1) AS RecordCount 
     , SUM(CASE 
       WHEN tc.InOut = 1 THEN 1 ELSE 0 
      END) AS InOutTrue 
    FROM TimeClock AS tc 
    GROUP BY tc.EmployeeId 
) AS t ON e.EmployeeId = t.EmployeeId 
WHERE t.InOutTrue > RecordCount - t.InOutTrue 

我不知道如果MySQL需要我这里使用的CAST,但SQL Server一样。 (这是我测试过的)它不能在BIT列上执行SUM

SELECT e.EmployeeId 
FROM Employee AS e 
INNER JOIN TimeClock AS tc ON e.EmployeeId = tc.EmployeeId 
GROUP BY e.EmployeeId 
HAVING SUM(CAST(tc.InOut AS INT)) > (COUNT(1) - SUM(CAST(tc.InOut AS INT))) 

如果三者的表现相似,则归结为个人偏好。

+0

Humm,我得到零行回到一张表,我知道EmployeeID 1有更多的InOut的真实比假...(样本数据有10个True,9假) – Fuginator

+0

减少上面的代码只是内部选择,并运行返回employeeid的零为bock InOutTrue和InOutFalse,如果这有帮助... – Fuginator

+0

@Fuginator什么是InType的DataType?它实际上是一个字符串,还是一个布尔?另外,还有其他的InOut值是否比True或False? –