如何在没有子查询的情况下构建单个(选择)查询

时间:2015-02-25 12:23:17

标签: sql informix

我构建了一个查询来获取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)

2 个答案:

答案 0 :(得分:1)

p.sku_nbr必须重复,否则子查询完全没有意义。如果没有关于为什么需要子查询的更多细节,就不可能对如何处理它提出坚定的建议。

这看起来像是性能问题,您真正需要做的是使用SET EXPLAIN ON运行此查询以确定优化程序选择的路径,以及是否可以执行任何索引优化以改进它

答案 1 :(得分:1)

如果没有表格的模式和数据分布,我们只能访客。

在您提到的查询中,您可以进行一次即时优化。

在您的子查询中,您只有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的{​​{1}},但效果的结果应该相同:

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 ); 子句的所有变体,比较您获得的时间和成本。

检查创建索引的可能性(如果它们不存在),您可以重写所有查询,但索引的存在应该是“密钥”。