我有四张桌子:
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
但order
,quote
和invoice
表非常大。所以join
导致查询永远运行(一个连接是O(m * n),三个连接是O(m * n * p * q))。
我可以基本上运行此查询三次,每次查询只有一个连接(O(m * n)+ O(m * p)+ O(m * q)),但我希望更优化溶液
这是针对Oracle的
答案 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
,这样只有三个表中任何一个中存在的不同公司都应该在该子查询的结果集中。然后内部联接过滤掉任何根本不存在的公司。