你是初学者,所以我觉得如果我向你展示一个prêt-à-porter查询,那么它就没有多大的帮助。相反,我会告诉你你的查询做了什么。
您正在使用过时的连接语法。您可以用显式关键字CROSS JOIN
替换表名之间的逗号。所以,你的主查询有:
FROM Agent, Policy, PolicyCover
它转换为
FROM Agent CROSS JOIN Policy CROSS JOIN PolicyCover
和手段:从代理抓住每一个记录,并从政策的每条记录将它们结合起来,然后把结果行,并与每一个将它们结合起来记录在PolicyCover中。假设代理有100条记录,策略200和PolicyCover 300.这使得100 x 200 x 300组合= 6,000,000行。
我们的WHERE
条款:
WHERE (Select sum(Salary+Commission) From Agent) <
(Select Min(Salary) From Agent Where Function = "Manager")
所以,你选择工资加commison从代理的总和。然后你从代理商中选择最低工资,这当然低于所有工资总额(加上佣金)。所以病情从未得到满足。您不选择记录。
如果您有条件满足的WHERE
子句,您将从无数行组合行中选择一些列加上一定数量的溢价值。让我们看看这个子查询:你交叉加入Policy和PolicyCover,从而创建所有组合。在WHERE
中,确保您从Policy表中获得的AgentNo存在于策略表中。那么,这当然是真的。
第一件事:学习正确的连接(INNER JOIN ... ON ...
开始)。考虑与表相关的内容,并只加入相关记录(例如,使用相同的保单号)。
接下来的事情:在处理多个表格时,使其符合您的列的使用习惯。例如Premium是Policy还是PolicyCover?通过指定表名来明确这一点:SUM(PolicyCover.Premium)
。或者使用表别名:FROM PolicyCover pc
和SUM(pc.Premium)
。
请发布这些数据库表的结构 – gaganshera
首先不要使用逗号分隔的连接。你似乎是一个初学者,所以谁教你使用在1992年**中被重复使用的连接语法?然后你一次又一次从相同的表格中选择。您的子查询甚至与主查询没有关系。 –
您被要求显示表格结构。请这样做。什么专栏属于哪个表?什么是表的主键? (顺便说一下:请添加MS Access标签,我不能因为有待编辑,请不要在没有标记DBMS的情况下询问SQL问题。) –