Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL连接条件子句_Sql_Sql Server - Fatal编程技术网

SQL连接条件子句

SQL连接条件子句,sql,sql-server,Sql,Sql Server,我的数据库如图所示(见下图) 我的任务是显示每个员工处理的订单的总价值。 我有一个SQL语句: SELECT e.FirstName, e.LastName, SUM(od.Quantity * od.UnitPrice * (1-od.Discount)) FROM Orders AS o JOIN Employees AS e ON o.EmployeeID = e.EmployeeID JOIN [Order Details] AS od ON o.Orde

我的数据库如图所示(见下图)

我的任务是显示每个员工处理的订单的总价值。 我有一个SQL语句:

SELECT e.FirstName,
       e.LastName,
       SUM(od.Quantity * od.UnitPrice * (1-od.Discount)) 
FROM Orders AS o
JOIN Employees AS e
ON o.EmployeeID = e.EmployeeID
JOIN [Order Details] AS od
ON o.OrderID = od.OrderID
GROUP BY e.FirstName,e.LastName
我对进一步的步骤有意见。我只需要为以下员工提供有限的结果:

  • A) 有员工在他们下面
  • B) 他们手下没有任何员工
我知道这与Employees表中的字段reports to有关,但我不知道如何获取适当的SQL子句。我应该用“存在”还是自连接

谢谢。

是的,只要使用就可以了

  Where Exists(Select 1 from Employees where ReportsTo = e.EmployeeId)

使用自联接尝试查找向其报告的人

SELECT e.FirstName,
       e.LastName,
       SUM(od.Quantity * od.UnitPrice * (1-od.Discount)) 
FROM Orders AS o
INNER JOIN Employees AS e    
   ON o.EmployeeID = e.EmployeeID
LEFT JOIN Employees as under  -- self join
   ON e.EmployeeID = under.ReportTo
INNER JOIN [Order Details] AS od
   ON o.OrderID = od.OrderID
GROUP BY e.FirstName,e.LastName

HAVING MAX(under.ReportTo) IS NULL     -- If doesnt find a match mean no one subordinate
   -- MAX(under.ReportTo) IS NOT NULL  -- mean have at least one subordinate

通过自联接,您可能会创建重复项,由于
分组方式
,因此很难调试
存在
,在
WHERE
子句中有一个相关的子查询,我将如何实现这一点

SELECT *
FROM Employees e
WHERE EXISTS(
  SELECT 1 
  FROM Employees _e 
  WHERE _e.ReportsTo = e.EmployeeID)
在您的查询中:

SELECT e.FirstName,
       e.LastName,
       SUM(od.Quantity * od.UnitPrice * (1-od.Discount)) 
FROM Orders AS o
JOIN Employees AS e
ON o.EmployeeID = e.EmployeeID
JOIN [Order Details] AS od
ON o.OrderID = od.OrderID
WHERE /*NOT*/ EXISTS(
  SELECT 1 
  FROM Employees _e 
  WHERE _e.ReportsTo = e.EmployeeID)
GROUP BY e.FirstName,e.LastName

你的关键字是A中的第一个单词和b中的第二个单词。其SQL关键字HAVING:)感谢您的重播,但不幸的是,该语句仅适用于for:MAX(在.ReportTo下)不为NULL,MAX(在.ReportTo下)为NULL不返回任何结果@下面的Dobbins语句工作正常,解决了存在的问题。我交换
左侧
内部
连接,请再次检查。如果只有一级报告,则此操作有效。如果您有多层人员(Sam向Janet报告,Janet向Amit报告,Amit向Trevor报告),此查询仅在您查询Trevor的报告时获取Amit的订单。但这就是他所需要的。他不需要知道是否有多个层次。他只需要知道这个人是否有人向他们报告。如果你需要重现级别,你可以使用CTE和Union ALL