我想听听是否有人可以告诉我一种简单的语法,该语法可以实现与以下相同的功能(具有相同的灵活性):

SELECT C.CompanyName,
(SELECT Count(*) FROM Employees WHERE CompanyId = C.Id) as EmployeeCount
FROM Company C

现在,重要的是给EmployeeCount的内部SELECT是:

  1. 独立的SELECT语句
    • 这意味着它应该与任何现有的SELECT一起使用,即使它已经包含联接等。
  2. 可以使用来自父SELECT的值

我知道可以通过其他方式轻松实现此方案,但以上只是简化示例来说明这一挑战。 我的实际情况是一个复杂的SELECT语句,在该语句中我不想通过添加更多联接来使其复杂化。 性能不是问题。

===============>>#1 票数:3 已采纳

使用INNER JOIN

SELECT C.CompanyName, Count(E.*) as EmployeeCount
FROM Company C
INNER JOIN Employees E on E.CompanyId = C.Id 

使用NESTED JOIN

SELECT C.CompanyName, Count(E.1) as EmployeeCount
FROM Company C, Employess E
WHERE E.CompanyId = C.Id

如果要使用相同的语法,请至少输入以下内容:

SELECT C.CompanyName,
(SELECT Count(1) FROM Employees WHERE CompanyId = C.Id) as EmployeeCount
FROM Company C

如果您需要显示所有数据,即使是没有雇员的公司数据,也可以使用LEFT OUTER JOIN

SELECT C.CompanyName, Count(E.*) as EmployeeCount
FROM Company C
LEFT OUTER JOIN Employees E on E.CompanyId = C.Id 

===============>>#2 票数:1

尝试使用派生表,该表可同时说明两个条件。

  1. 独立的SELECT语句。
    一种。 使用派生表可让您保留独立的Select语句

  2. 可以使用来自父SELECT的值。

    一种。 作为内部联接,您仍然可以使用父选择中的值。


SELECT 
  C.CompanyName, 
  EC.EmployeeCount
FROM Company C 
INNER JOIN (SELECT 
              Count(*) AS EmployeeCount 
            FROM Employees ) EC 
  ON WHERE EC.CompanyId = C.Id

===============>>#3 票数:1

如果您的内部选择很复杂,那么为什么不看一下它:

CREATE VIEW EmpSelect AS
    SELECT CompanyId, whatever FROM Employees;

然后

SELECT
    C.CompanyName, Count(*) AS EmpCount
FROM
    Company C
    LEFT JOIN EmpSelect E
        ON C.Id = E.CompanyId
GROUP BY
    C.CompanyName;

  ask by Niels Brinch translate from so

未解决问题?本站智能推荐: