如何在没有子查询的情况下构建单个(select)查询
How to frame a single(select) query without subquery
我构建了一个查询来获取 SKU 编号,但该查询也有子查询。
谁能帮我构造一个查询。
select p.sku_nbr
from table1 p, table2 s
where p.sku_nbr = s.sku_nbr
and p.typ_cd = 10
and p.sku_nbr not in (select sku_nbr from table1
where typ_cd <> 10)
p.sku_nbr
必须重复,否则子查询根本没有意义。如果不详细说明为什么需要子查询,就不可能就如何处理它提出明确的建议。
这看起来像是一个性能问题,您真正需要做的是 运行 这个带有 SET EXPLAIN ON
的查询以确定优化器选择的路径,以及是否有任何索引优化可以做一些改进。
在没有两个表的模式和数据分布的情况下,我们只能来宾。
在您提到的查询中,您可以进行一次即时优化。
在您的子查询中,您将只有 sku_nbr
具有 typ_cd equals = 10
,因此无需检查您的查询中的 typ_cd
是否等于 10。你可以拥有:
SELECT p.sku_nbr
FROM table1 p, table2 s
WHERE p.sku_nbr = s.sku_nbr
AND p.sku_nbr NOT IN (
SELECT p2.sku_nbr
FROM table1 p2
WHERE p2.typ_cd <> 10
);
您可以将 NOT IN
更改为 ALL
,但在性能方面的结果应该是相同的:
SELECT p.sku_nbr
FROM table1 p, table2 s
WHERE p.sku_nbr = s.sku_nbr
AND p.sku_nbr <> ALL (
SELECT p2.sku_nbr
FROM table1 p2
WHERE p2.typ_cd <> 10
);
我相信,但我还是没有你最好选择使用的架构或数据分布 NOT EXISTS
:
SELECT p.sku_nbr
FROM table1 p, table2 s
WHERE p.sku_nbr = s.sku_nbr
AND NOT EXISTS (
SELECT p2.sku_nbr
FROM table1 p2
WHERE p2.typ_cd <> 10
AND p2.sku_nbr = p.sku_nbr
);
你也可以试试:
SELECT p.sku_nbr
FROM table1 p
WHERE EXISTS (
SELECT s.sku_nbr
FROM table2 s
WHERE p.sku_nbr = s.sku_nbr
)
AND NOT EXISTS (
SELECT p2.sku_nbr
FROM table1 p2
WHERE p2.typ_cd <> 10
AND p2.sku_nbr = p.sku_nbr
);
您应该尝试使用 SET EXPLAIN ON
子句的所有变体,比较您获得的时间和成本。
如果索引不存在,检查创建索引的可能性,你可以重写所有查询,但索引的存在应该是"key"。
我构建了一个查询来获取 SKU 编号,但该查询也有子查询。
谁能帮我构造一个查询。
select p.sku_nbr
from table1 p, table2 s
where p.sku_nbr = s.sku_nbr
and p.typ_cd = 10
and p.sku_nbr not in (select sku_nbr from table1
where typ_cd <> 10)
p.sku_nbr
必须重复,否则子查询根本没有意义。如果不详细说明为什么需要子查询,就不可能就如何处理它提出明确的建议。
这看起来像是一个性能问题,您真正需要做的是 运行 这个带有 SET EXPLAIN ON
的查询以确定优化器选择的路径,以及是否有任何索引优化可以做一些改进。
在没有两个表的模式和数据分布的情况下,我们只能来宾。
在您提到的查询中,您可以进行一次即时优化。
在您的子查询中,您将只有 sku_nbr
具有 typ_cd equals = 10
,因此无需检查您的查询中的 typ_cd
是否等于 10。你可以拥有:
SELECT p.sku_nbr
FROM table1 p, table2 s
WHERE p.sku_nbr = s.sku_nbr
AND p.sku_nbr NOT IN (
SELECT p2.sku_nbr
FROM table1 p2
WHERE p2.typ_cd <> 10
);
您可以将 NOT IN
更改为 ALL
,但在性能方面的结果应该是相同的:
SELECT p.sku_nbr
FROM table1 p, table2 s
WHERE p.sku_nbr = s.sku_nbr
AND p.sku_nbr <> ALL (
SELECT p2.sku_nbr
FROM table1 p2
WHERE p2.typ_cd <> 10
);
我相信,但我还是没有你最好选择使用的架构或数据分布 NOT EXISTS
:
SELECT p.sku_nbr
FROM table1 p, table2 s
WHERE p.sku_nbr = s.sku_nbr
AND NOT EXISTS (
SELECT p2.sku_nbr
FROM table1 p2
WHERE p2.typ_cd <> 10
AND p2.sku_nbr = p.sku_nbr
);
你也可以试试:
SELECT p.sku_nbr
FROM table1 p
WHERE EXISTS (
SELECT s.sku_nbr
FROM table2 s
WHERE p.sku_nbr = s.sku_nbr
)
AND NOT EXISTS (
SELECT p2.sku_nbr
FROM table1 p2
WHERE p2.typ_cd <> 10
AND p2.sku_nbr = p.sku_nbr
);
您应该尝试使用 SET EXPLAIN ON
子句的所有变体,比较您获得的时间和成本。
如果索引不存在,检查创建索引的可能性,你可以重写所有查询,但索引的存在应该是"key"。