0

给定一个SELECT带有任意嵌套子选择的 SQL 表达式,是否总是可以重写所述 SQL 表达式,使其不包含子选择并返回相同的结果集?

如果是这样,是否有这样做的算法?

如果没有,是否存在SELECT无法重写的那些表达式的特征?

我正在制作一个将生成 SQLSELECT语句的应用程序。在这一点上,我仍在设计它的工作方式。不过,这是一般的想法:

用户将选择显示哪些列、结果如何排序以及如何限制。

这些列不仅是 SQL 列,而且是命名对象,因此该对象可以包含一个 SQL 表达式,其中包含来自多个表的列变量。这些对象将包含有关如何相互连接的信息。

我想让这些表达式的配置尽可能灵活;如果可以编写返回某些结果集的 SELECT 语句S,那么我希望应用程序能够生成SELECT返回的语句S。SQL 中可能的一件事是子选择。我读过用 JOINS 重写所说的子选择在性能方面会更好。因此,我正在考虑在配置中禁止子选择。但是我不想这样做,除非每个子选择都可以重写为连接。

4

1 回答 1

1

WHERE 子句中的子选择通常不可能重写为 JOIN,尤其是在使用聚合函数时。

从这里引用:

下面是一个普通形式的子查询比较示例,您不能使用连接进行比较:查找表 t1 中与表 t2 中的最大值相等的所有值。

SELECT column1 FROM t1 WHERE column1 = (SELECT MAX(column2) FROM t2);

这是另一个示例,这对于连接也是不可能的,因为它涉及聚合其中一个表:查找表 t1 中包含出现两次的值的所有行。

SELECT * FROM t1 WHERE 2 = (SELECT COUNT(column1) FROM t1);

因此,如果 SELECT 子句中的复杂子选择本身在其 WHERE 子句中具有子选择,则可能无法表示为 JOIN。

SELECT T2.B, (SELECT A from t1 where t1.ID=T2.ID 
                         and 2=(SELECT COUNT(A) from t1 as TX WHERE TX.A=T1.A))
FROM T2
于 2012-09-02T03:22:32.237 回答