Как добавить count () для одной таблицы в запрос SQL, содержащий объединения для нескольких других таблиц, использующих SQLite? - PullRequest
0 голосов
/ 10 января 2020

У меня есть оператор sql, который извлекает данные из нескольких таблиц. Этот запрос получает информацию о всех сотрудниках и их биографии c (идентификатор сотрудника, имя, фамилия, изображение значка и т. Д. c.):

SELECT
e.ID as id,
e.DateTimeCreated as dateTimeCreated,
e.FullTime as fullTime,
bi.FirstName as firstName,
bi.LastName as lastName,
bi.MiddleName as middleName,
bi.DateOfBirth as dateOfBirth,
bi.PlaceOfBirth as placeOfBirth,
fr.Thumbnail as thumbnail
FROM employee e
LEFT JOIN biographicinfo bi
ON e.ID = bi.employeeId
LEFT JOIN facialraw fr
ON e.ID = fr.EnrollmentId
AND fr.CaptureAngle = 2
GROUP BY e.ID

Теперь есть еще одна таблица, скажем , EmployeeDiscrepencies, на которые я хотел бы рассчитывать:

select count(1) as "Discrepencies" from EmployeeDiscrepencies ed where ed.employeeId = 2;

Я хотел бы добавить этот оператор подсчета в свой исходный запрос, когда собираю всех сотрудников, но не могу понять, как это сделать. Я хотел попробовать что-то вроде этого:

SELECT
e.ID as id,
e.DateTimeCreated as dateTimeCreated,
e.FullTime as fullTime,
bi.FirstName as firstName,
bi.LastName as lastName,
bi.MiddleName as middleName,
bi.DateOfBirth as dateOfBirth,
bi.PlaceOfBirth as placeOfBirth,
fr.Thumbnail as thumbnail,
ed.count(1), -- need a "where" clause here
FROM employee e
LEFT JOIN biographicinfo bi
ON e.ID = bi.employeeId
LEFT JOIN facialraw fr
ON e.ID = fr.EnrollmentId
LEFT JOIN EmployeeDiscrepencies ed
on e.ID = ed.employeeID
AND fr.CaptureAngle = 2
GROUP BY e.ID

Как вы можете догадаться, это не работает

Как мне go выполнить это?

Ответы [ 2 ]

1 голос
/ 10 января 2020

Если вам нужен только этот счетчик из EmployeeDiscrepencies, то самый простой способ - использовать подзапрос, чтобы вернуть его так:

SELECT
e.ID as id,
e.DateTimeCreated as dateTimeCreated,
e.FullTime as fullTime,
bi.FirstName as firstName,
bi.LastName as lastName,
bi.MiddleName as middleName,
bi.DateOfBirth as dateOfBirth,
bi.PlaceOfBirth as placeOfBirth,
fr.Thumbnail as thumbnail,
(SELECT COUNT(*) FROM EmployeeDiscrepencies ed WHERE e.ID = ed.employeeID) as Discrepencies
FROM employee e
LEFT JOIN biographicinfo bi
ON e.ID = bi.employeeId
LEFT JOIN facialraw fr
ON e.ID = fr.EnrollmentId
AND fr.CaptureAngle = 2
GROUP BY e.ID

Если ваше условие только для employeeId = 2, тогда перекрестное соединение Ваш запрос к подзапросу будет более эффективным:

SELECT
e.ID as id,
e.DateTimeCreated as dateTimeCreated,
e.FullTime as fullTime,
bi.FirstName as firstName,
bi.LastName as lastName,
bi.MiddleName as middleName,
bi.DateOfBirth as dateOfBirth,
bi.PlaceOfBirth as placeOfBirth,
fr.Thumbnail as thumbnail,
ed.counter as Discrepencies
FROM employee e
CROSS JOIN (SELECT COUNT(*) count FROM EmployeeDiscrepencies ed WHERE  ed.employeeID = 2) ed
LEFT JOIN biographicinfo bi
ON e.ID = bi.employeeId
LEFT JOIN facialraw fr
ON e.ID = fr.EnrollmentId
AND fr.CaptureAngle = 2
GROUP BY e.ID
0 голосов
/ 10 января 2020

Хотелось бы что-то подобное для вас - я сделал это быстро и не проверил ошибки, поэтому просто убедитесь, что все закрывающие / открывающие скобки находятся в правильном месте.

   SELECT
   e.ID as id,
   e.DateTimeCreated as dateTimeCreated,
   e.FullTime as fullTime,
   bi.FirstName as firstName,
   bi.LastName as lastName,
   bi.MiddleName as middleName,
   bi.DateOfBirth as dateOfBirth,
   bi.PlaceOfBirth as placeOfBirth,
   fr.Thumbnail as thumbnail,
   [EmployeeDis].[Discrepencies] 
FROM
   employee e 
OUTER APPLY ( 
   select
      count(1) as [Discrepencies] 
   from
      EmployeeDiscrepencies ed 
   where
      ed.employeeId = 2;
) as [EmployeeDis] 
      LEFT JOIN
         biographicinfo bi 
         ON e.ID = bi.employeeId 
      LEFT JOIN
         facialraw fr 
         ON e.ID = fr.EnrollmentId 
         AND fr.CaptureAngle = 2 
   GROUP BY
      e.ID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...