【问题标题】:Accessing a field in a sub-subquery SQL访问子查询 SQL 中的字段
【发布时间】:2011-04-18 14:34:12
【问题描述】:

我有一个相当复杂的查询,我正在处理多个嵌套的查询层。查询的要求之一是我在主查询中从子查询的子查询中访问一个字段。但是,由于中间查询中的聚合,我无法在该查询中包含该字段。

例如。

select a, d.x, f.v?
from b
  join (select a, max(z), min(z), Count(y) as x
        from c
          join (select a, Count(t) as v
                from e
               ) f 
            on f.a = c.a
            Group By a
            Having min(z) <> max(z)
       ) d 
     on d.a = b.a

这可能吗?

【问题讨论】:

  • jas,您能否修改您的示例,如您所说,在适当的查询中有聚合?基本上,如果您需要在内部层中丢失它,您将无法在不将行炸开的情况下将其取回。

标签: sql sql-server subquery


【解决方案1】:

没有。

试试这个。基本上,在您上层时获取您需要的属性(如果需要,可以重命名它们),然后使用它们。

Select a, d.fa From b
join (select a,f.a fa from c
join (select a from e) f on f.a = c.a
) d on d.a = b.a

我还没有测试表。如果您发现更多问题,请在此处发布。

* 根据更新的问题进行编辑*

即使在这里,逻辑仍然相同,您必须使用...

select a, d.x, d.v?
from b
  join (select a, f.v, max(z), min(z), Count(y) as x
        from c
          join (select a, v
                from e
               ) f 
            on f.a = c.a
            Group By a, f.v
            Having min(z) <> max(z)
       ) d 
     on d.a = b.a

或者,如果您的数据库支持标量子查询,您可以使用..获取最终外部查询的值。

select a, d.x, (select v from e where e.a = b.a) f_v
from b
  join (select a, max(z), min(z), Count(y) as x
        from c
          join (select a, v
                from e
               ) f 
            on f.a = c.a
            Group By a
            Having min(z) <> max(z)
       ) d 
     on d.a = b.a

【讨论】:

  • 嘿,抱歉,我刚刚做了一个编辑,我忘了提到由于聚合,我无法在中间查询中包含该字段
  • 您能否修改您的查询以显示您如何使用聚合(至少是一个示例)?简短的回答是否定的,您无法从 2 层以下访问它们,但总有一种解决方法。 :)
  • 正如我在下面所说的,我忘了包括 v 本身就是一个聚合函数,所以我不能通过它,因为它改变了我的中间查询 sql server 支持标量子查询吗?跨度>
  • 看起来他们是..检查此链接..databasejournal.com/features/mssql/article.php/3407911/….
【解决方案2】:

如果您只是将您关心的表(在本例中为 e)带回 From 子句,这可能更直接

SELECT a, 
       d.x, 
       e.v 
FROM   b 
       JOIN (SELECT a, 
                          MAX(z), 
                          MIN(z), 
                          COUNT(y) AS x 
                   FROM   c 
                          JOIN (SELECT a 
                                FROM   e) f 
                            ON f.a = c.a 
                   GROUP  BY a 
                   HAVING MIN(z) <> MAX(z)) d 
         ON d.a = b.a 
       JOIN (SELECT a, Count(t) as v
            FROM e
            GROUP BY A ) e
         ON e.a = d.a 

【讨论】:

  • 对不起,忘记包含 v 本身是一个聚合函数,主查询中的数据不会返回相同的值
  • @jas 我已经更新了我的答案以反映这一变化。似乎您实际上并未在 d 子查询中使用 (Count(t) as v)。在这种情况下,将这部分作为单独的查询拉出来可能是值得的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-01
相关资源
最近更新 更多