自我加入自引用列

时间:2018-06-16 19:46:13

标签: sql postgresql self-join self-reference

我试图加入两个表格,例如我打电话给第一个表格' fund'和第二个表格' company'。

基金表中包含与公司子集相关的基金信息。然而,基金表只存储单个公司(父母)的id:

fund table

公司表包含有关公司的信息行,包括我需要搜索的外部系统的标识符。公司可以通过自引用列与另一家公司相关,通过规则集只允许单一级别的层次结构。

company table

来自数据库的信息请求将始终带有外键,这可以属于补贴(子)或母公司实体。目标是找到与公司相关的所有子女和母公司实体,以及加入基金表以获取更多信息。

由于请求量很大,因此需要对其进行优化。目前我正在运行以下查询,该查询有效,但由于多个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来保持唯一)?

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';

这将运行四个查询,但是他们可以有效地使用索引,如果你在连接条件上有索引,你可能会更快。