FROM 子句中子查询的替代方法

Alternative for subquery in the FROM clause

我的这个查询在 FROM 子句中有子查询

SELECT x, y 
FROM FOO 
WHERE y IN (SELECT y 
            FROM 
                (SELECT y, z, MIN(v)  
                 FROM BAR 
                 GROUP BY y, z))

教class的教授说不是所有的数据库都支持,我应该只在WHERE子句中使用子查询。

我正在尝试将上面的查询转换为不在 FROM 子句中使用子查询,但无法解决这个问题。

有什么想法吗?

这回答了问题的原始版本。

所有数据库都支持 FROM 子句中的子查询。

正如所写,聚合是完全没有必要的。您正在比较 y 个值。 v 的计算无关紧要。所以,你不妨这样写:

SELECT x, y
FROM FOO
WHERE y in (SELECT y FROM BAR)

首先,sub-query:

SELECT y FROM ( SELECT y,z min(v)  FROM  BAR groupby y,z)

除了在 z 之后缺少一个逗号和在 groupby 之间缺少一个 space 之外,相当于:

SELECT y from (SELECT DISTINCT y, z FROM BAR) sq1

相当于:

SELECT y from (SELECT DISTINCT y FROM BAR) sq1

相当于:

SELECT DISTINCT y FROM BAR

所以:

SELECT x, y
FROM FOO
WHERE y in (
    SELECT DISTINCT y FROM BAR
)

您可以按照以下方式进行 -

Select distinct FOO.x,FOO.y 
  FROM FOO 
  JOIN ( SELECT y,z, min(v)  FROM  BAR groupby y,z) TAB 
  ON FOO.y = TAB.y;

我同意 Gordon 的其他评论,即聚合是完全没有必要的。但是,我已经接近您在我的回复中尝试的内容,并且仍然给出了正确的结果,同时使用 Join.

消除了额外的 sub-query