我是SQL的新手,所以对某人来说这可能是一个简单的问题。现在我有两张桌子,让我们说A和B.
A列有"性别","年龄","学位","多年的工作经验",&#34 ;居住状态","技能水平"和"职业"。
B列有"性别","年龄","学位","多年的工作经验",&#34 ;居住州"和"年收入"。 (前5个与A中相同)
现在我想从B中搜索这5个标准并添加一个列"年收入"表A.我尝试使用INNER JOIN,如:
SELECT A. *,B.annual_income
FROM B INNER JOIN A ON(A.gender = B.gender)
AND(A.age = B.age)
AND(A.academic_degree = B.academic_degree)
AND(A.years_of_working_experience = B.years_of_working_experience)
AND(A.state_of_residence = B.state_of_residence);
代码确实有效,但耗时太长。有谁知道是否有更快的算法来解决这个问题?谢谢!
答案 0 :(得分:0)
您的查询对于您要解决的任务是正确的,但如果您遇到性能问题,则可能需要为表添加索引。这篇文章是开始学习它的好地方:Create and use an index to improve performance(虽然它为Access 2007编写,但它也适用于更高版本。)
旁注:您在很多不同的列上加入了表格,这两个表格在它们存储的内容中似乎重叠很多,这可能表明设计存在问题。
我会考虑annual_income
是否真的属于一个单独的表 - 它似乎依赖于与所有其他信息相同的密钥。这两个表似乎都包含与单个人相关的数据 - 该人是另一个表中的实体,如果是这样,这两个表是否应该通过外键关系引用该表?
您的问题可能会遗漏一些有关您的设置的重要细节,以便为您提供适当的"答案。
答案 1 :(得分:0)
查询性能调优可能是一个棘手的话题......我可能会提供一些提示,但您需要考虑的更多信息,而不仅仅是问题中提供的信息,以确定解决方案。
我从您的问题标签中收集到您正在使用MS Access,因此这是我的工作假设......我还假设数据是本地的(即存储在.MDB文件中,而不是链接的远程表)。
您可以对查询性能产生的最大影响是确保您的查询与您的物理数据模型协作。你所描述的表格结构可能会使生活变得难以诚实。
每个表中是否还有其他列,例如代理键?如果您可以使用更简单的连接,它可能有助于提高性能。无论您是否拥有更简单的连接密钥,确保在两个表中正确索引连接密钥可能是影响性能的最重要的一步。
你问是否有另一种算法......当你编写SQL时,你并没有真正考虑具体的算法 - 数据库负责这一点 - 但对于问题的精神,我会说不。你需要做一个连接。
如果您需要多次执行此操作,则可能需要改进物理数据模型。 (如果您只需要加入数据一次,那么这可能就不值得了,因为将数据转换为改进的模型可能需要花费一次加入连接。)
因此,假设情况是(年龄,性别,程度,年份,状态)的每个组合在每个表中只出现一次,您可以创建一个新表,为每个组合分配一个唯一的整数;然后为每个表添加一个索引整数列以存储指定的值。对此的加入应该比你拥有的更好。
答案 2 :(得分:0)
永远不会存储数据两次..尝试合并信息并摆脱一个表。关于您的问题,您可以创建所有5列的新列计算哈希值,并加入该列以使其更快。
检查此计算哈希值: https://superuser.com/questions/550592/is-there-an-excel-function-to-create-a-hash-value