选择多个表之一中引用的条目

时间:2017-12-28 05:31:37

标签: sql oracle join

我有四张桌子:

company
id | name

order
number | company_id

quote
number | company_id

invoice
number | company_id

我想获得三个中任何一个引用的公司列表(即排除不在任何公司中的公司)。

我写了这个查询:

select c.id, c.name from company c
left outer join order o on o.company_id = c.id
left outer join quote q on q.company_id = c.id
left outer join invoice i on i.company_id = c.id
where o.number is not null or q.number is not null or i.number is not null

orderquoteinvoice表非常大。所以join导致查询永远运行(一个连接是O(m * n),三个连接是O(m * n * p * q))。

我可以基本上运行此查询三次,每次查询只有一个连接(O(m * n)+ O(m * p)+ O(m * q)),但我希望更优化溶液

这是针对Oracle的

1 个答案:

答案 0 :(得分:2)

加入一个子查询,该子查询执行三个订单表的并集:

SELECT
    c.id, c.name
FROM company c
INNER JOIN
(
    SELECT company_id FROM order
    UNION
    SELECT company_id FROM quote
    UNION
    SELECT company_id FROM invoice
) t
    ON c1.id = t.company_id

联合查询应该自动删除重复的company_id,这样只有三个表中任何一个中存在的不同公司都应该在该子查询的结果集中。然后内部联接过滤掉任何根本不存在的公司。