如何在没有子查询的情况下构建单个(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"。