【发布时间】:2020-06-24 13:37:10
【问题描述】:
我知道以前有人问过这类问题,但我找不到与我的确切问题相关的问题。 我会试着举一个夸张的例子。
假设我们想要找到至少一名员工年龄超过 40 岁且至少一名客户年龄低于 20 岁的公司。
我的同事为这个问题写的查询是这样的:
SELECT DISTINCT(c.NAME) FROM COMPANY c
LEFT JOIN EMPLOYEE e ON c.COMPANY_ID = e.COMPANY_ID
LEFT JOIN CUSTOMER u ON c.COMPANY_ID = u.COMPANY_ID
WHERE e.AGE > 40 and u.AGE < 20
我是数据库新手。但是看看这个查询(就像一个时间复杂度问题),它会创建一个不必要的巨大临时表。每个公司都有employeeAmount x customerAmount 行。
所以,我重新编写了查询:
SELECT c.NAME FROM COMPANY c
WHERE EXISTS (SELECT * FROM EMPLOYEE e WHERE e.AGE > 40 AND c.COMPANY_ID = e.COMPANY_ID )
OR EXISTS (SELECT * FROM CUSTOMER u WHERE u.AGE < 20 AND c.COMPANY_ID = u.COMPANY_ID )
我不知道这个查询是否会更糟,因为它将为每个公司运行 2 个子查询。
我知道有更好的方法来写这个。例如,为 2 个年龄条件编写 2 个不同的子查询,然后将它们联合起来可能会更好。但我真的很想知道两个查询之一/两个是否有问题。
注意:您可以增加连接/子查询的数量。例如,“我们希望找到至少一名员工年龄超过 40 岁、至少一名客户年龄低于 20 岁的公司并且至少有一份订单超过 1000 美元”
谢谢。
【问题讨论】:
-
您不应该使用
AND结合两个EXISTS来正确回答您的问题吗?
标签: sql oracle performance