使用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
。