2011-04-18 29 views
3

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

例如。

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 

这可能吗?

+0

雅OU护理,你可以修改你的例子是这样,就像你说的,有一个在适当的查询集合?基本上,如果你需要在内层丢失它,你将无法在没有爆炸的情况下恢复原状。 – Beth 2011-04-18 14:47:28

回答

3

编号

试试这个。基本上,获取你需要的属性,当你上升阶层(可能需要重命名),然后使用它们。

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 
+0

嘿,对不起,我只是做了一个编辑 我忘记提及,由于聚合,我不能在中间查询中包含该字段 – jas 2011-04-18 14:42:11

+0

您是否可以修改查询以显示如何使用聚合(至少是一个样本)?简短答案是否定的,你不能从2个级别访问它们,但总是有解决方法。 :) – 2011-04-18 14:49:33

+0

更清楚了吗? – jas 2011-04-18 14:58:58

1

它可能是更直接的,如果你只是把表y有关(在这种情况下,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 
+0

对不起,忘记将v包含在其本身中是一个聚合函数,主查询中的数据将不会返回相同的值 – jas 2011-04-18 16:26:56

+0

@jas我更新了我的答案以反映此更改。看起来好像你没有在你的'd'子查询中实际使用('Count(t)as v')。情况就是这样,它可能值得把这部分作为一个单独的查询 – 2011-04-18 16:30:16