Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.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查询在特定列中指定3个以上的外键实例?_Sql - Fatal编程技术网

使用SQL查询在特定列中指定3个以上的外键实例?

使用SQL查询在特定列中指定3个以上的外键实例?,sql,Sql,我尝试执行以下查询: SELECT employees.ename FROM employees JOIN certified ON certified.eid = employees.eid JOIN aircraft ON aircraft.aid = certified.aid WHERE aircraft.aid = (certified.aid > 3) GROUP BY employees.ename; 我试图做的是返回所有在三架以上飞机上获得认证的飞行员(employees

我尝试执行以下查询:

SELECT employees.ename
FROM employees
JOIN certified ON certified.eid = employees.eid
JOIN aircraft ON aircraft.aid = certified.aid
WHERE aircraft.aid = (certified.aid > 3)
GROUP BY employees.ename;

我试图做的是返回所有在三架以上飞机上获得认证的飞行员(employees.ename和first join)(第二次join&WHERE声明)。但上面的结果一无所获。很抱歉,如果有一个明显的答案,我对SQL非常陌生,正在自学。

我想你需要的是
有一个
子句。您需要分组的计数(在本例中为e.ename),因此不能使用
WHERE

SELECT e.ename
FROM employees e
JOIN certified c ON c.eid = e.eid
JOIN aircraft a ON a.aid = c.aid
GROUP BY e.ename
HAVING COUNT(e.ename) > 3

我想你需要的是
子句。您需要分组的计数(在本例中为e.ename),因此不能使用
WHERE

SELECT e.ename
FROM employees e
JOIN certified c ON c.eid = e.eid
JOIN aircraft a ON a.aid = c.aid
GROUP BY e.ename
HAVING COUNT(e.ename) > 3

您的查询似乎确实不会返回任何结果,因为对于大多数行(如果不是所有行),筛选器谓词(
airpair.aid=(certified.aid>3)
)可能与您的一个连接条件(
airpair.aid=certified.aid
)不一致。事实上,过滤器谓词虽然在技术上是有效的,但意义不大

我推断,您在表
certified
中有一行单独描述了每个员工对每架飞机的认证,您要做的是识别那些至少有三个此类记录的员工。由于join的每一行都将特定的员工与特定的飞机相关联,所以您需要聚合这些行以从这些行的组中获取信息。SQL具有用于此目的的聚合函数

但是,聚合查询只能选择组所基于的列以及组的聚合函数,尽管您可以按
employees.ename
进行分组,但它不是一个自然分组列。由于几个原因,相应的
eid
会更好。可以通过(内联)视图或公共表表达式执行聚合来解决:

SELECT employees.ename
FROM
  employees
  JOIN (
    SELECT certified.eid AS eid
    FROM
      certified
      JOIN aircraft ON aircraft.aid = certified.aid
    GROUP BY certified.eid
    HAVING COUNT(*) > 3
  ) AS mc
  ON employees.eid = mc.eid
首先将
certified
加入
Aircrafter
,通过
eid
聚合结果,并仅保留满足您标准的组(
具有计数(*)>3
),然后将结果加入
employees
表,以获得每个
eid
ename

基本上相同方法的另一种实现方式是

SELECT ename
FROM employees
WHERE eid IN (
  SELECT certified.eid
  FROM
    certified
    JOIN aircraft ON aircraft.aid = certified.aid
  GROUP BY certified.eid
  HAVING COUNT(*) > 3
)

根据您的数据和DBMS,您可能会发现其中一个运行得比另一个快,但通常无法预测会是哪一个。

您的查询确实可能不会返回任何结果,因为筛选谓词(
aircraft.aid=(certified.aid>3)
)对于大多数行(如果不是所有行),可能与您的加入条件之一(
aircraft.aid=certified.aid
)不一致。事实上,过滤器谓词虽然在技术上是有效的,但意义不大

我推断,您在表
certified
中有一行单独描述了每个员工对每架飞机的认证,您要做的是识别那些至少有三个此类记录的员工。由于join的每一行都将特定的员工与特定的飞机相关联,所以您需要聚合这些行以从这些行的组中获取信息。SQL具有用于此目的的聚合函数

但是,聚合查询只能选择组所基于的列以及组的聚合函数,尽管您可以按
employees.ename
进行分组,但它不是一个自然分组列。由于几个原因,相应的
eid
会更好。可以通过(内联)视图或公共表表达式执行聚合来解决:

SELECT employees.ename
FROM
  employees
  JOIN (
    SELECT certified.eid AS eid
    FROM
      certified
      JOIN aircraft ON aircraft.aid = certified.aid
    GROUP BY certified.eid
    HAVING COUNT(*) > 3
  ) AS mc
  ON employees.eid = mc.eid
首先将
certified
加入
Aircrafter
,通过
eid
聚合结果,并仅保留满足您标准的组(
具有计数(*)>3
),然后将结果加入
employees
表,以获得每个
eid
ename

基本上相同方法的另一种实现方式是

SELECT ename
FROM employees
WHERE eid IN (
  SELECT certified.eid
  FROM
    certified
    JOIN aircraft ON aircraft.aid = certified.aid
  GROUP BY certified.eid
  HAVING COUNT(*) > 3
)

根据您的数据和DBMS,您可能会发现其中一个运行得比另一个快,但通常无法预测会是哪一个。

如果有多个员工的姓名完全相同(
e.ename
),那么这当然会将结果合并为一个。为了防止出现此问题,您可以取而代之的是
e.eid
,然后使用外部查询将其包装,以获取
e.ename
。如果有多个员工的姓名完全相同(
e.ename
),当然会将结果合并为一个。为了避免这个问题,您可以取而代之的是获取
e.eid
,然后使用外部查询将其包装起来,以获取
e.ename