我试图加入两个表格,例如我打电话给第一个表格' fund'和第二个表格' company'。
基金表中包含与公司子集相关的基金信息。然而,基金表只存储单个公司(父母)的id:
公司表包含有关公司的信息行,包括我需要搜索的外部系统的标识符。公司可以通过自引用列与另一家公司相关,通过规则集只允许单一级别的层次结构。
来自数据库的信息请求将始终带有外键,这可以属于补贴(子)或母公司实体。目标是找到与公司相关的所有子女和母公司实体,以及加入基金表以获取更多信息。
由于请求量很大,因此需要对其进行优化。目前我正在运行以下查询,该查询有效,但由于多个OR过滤器而显得很昂贵:
SELECT * FROM fund
JOIN company AS csearch ON (csearch.companycompositekey = fund.companycompositekey OR csearch.parentcompositekey = fund.companycompositekey)
JOIN company ON (company.companycompositekey = fund.companycompositekey OR company.parentcompositekey = fund.companycompositekey)
WHERE csearch.externalkey = '997'
我的SQL技能非常糟糕,所以我想知道我是否完全错了?一个' WITH RECURSIVE(...为父母选择)JOIN基金加入儿童'是一个更好的方法?别的什么?
是否也可以优化过滤器' externalkey' (通过在JOIN上调用LIMIT 1来保持唯一)?
答案 0 :(得分:1)
尝试将OR
替换为UNION
所有可能的组合:
SELECT * FROM fund
JOIN company AS csearch ON csearch.companycompositekey = fund.companycompositekey
JOIN company ON company.companycompositekey = fund.companycompositekey
WHERE csearch.externalkey = '997'
UNION
SELECT * FROM fund
JOIN company AS csearch ON csearch.companycompositekey = fund.companycompositekey
JOIN company ON company.parentcompositekey = fund.companycompositekey
WHERE csearch.externalkey = '997'
UNION
SELECT * FROM fund
JOIN company AS csearch ON csearch.parentcompositekey = fund.companycompositekey
JOIN company ON company.companycompositekey = fund.companycompositekey
WHERE csearch.externalkey = '997'
UNION
SELECT * FROM fund
JOIN company AS csearch ON csearch.parentcompositekey = fund.companycompositekey
JOIN company ON company.parentcompositekey = fund.companycompositekey
WHERE csearch.externalkey = '997';
这将运行四个查询,但是他们可以有效地使用索引,如果你在连接条件上有索引,你可能会更快。