Вложенные операторы select в mySQL - PullRequest
2 голосов
/ 09 декабря 2011

У меня есть существующий SQL-запрос, который прекрасно работает в SQL Server, и я хотел бы, чтобы он работал в MySQL.Я немного его исправил и поиграл с галочками для имен столбцов / таблиц и т. Д., Но не могу заставить его работать.

Вот заявление, о котором идет речь:

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')
   )
)

Это должно вернуть любые EmployeeID, которые имеют InOut = True больше, чем InOut = False в таблице TimeClock.

Спасибо.

1 Ответ

1 голос
/ 09 декабря 2011

Это должно предоставить вам значения EmployeeId, где больше значений InOut True, чем False

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

Две предложенные мной альтернативы показывают схожую производительность с моими ОЧЕНЬ МАЛЕНЬКИМИ неиндексированными данными испытаний. Я бы порекомендовал вам проверить их на основе ваших собственных данных, чтобы увидеть, имеют ли они какое-либо значение:

Это почти то же самое, но с использованием общего количества записей вместо 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 сделал. (Это то, с чем я их проверял) Он не может выполнить SUM для столбца BIT.

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)))

Если все три действуют одинаково, то это сводится к личным предпочтениям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...