带有/ LEFT JOIN的SQL子查询导致无效的对象错误

时间:2013-11-26 17:56:26

标签: sql sql-server sql-server-2008 ssrs-2000

我有一个具有以下结构的查询:

编辑查询的原始结构不太具有代表性。

SELECT   A
        ,B
        ,C
        ,D

FROM ( SELECT id,A
       FROM myTable 
       WHERE conditions 
       GROUP BY id,A) MainQuery
LEFT JOIN (SELECT id, B, C 
           FROM myView
           WHERE id IN
             (
                  SELECT DISTINCT id
                  FROM MainQuery
             )
          ) sub1
   ON sub1.B = MainQuery.A
LEFT JOIN (SELECT MainQuery.id, D
           FROM myOtherView
           WHERE sub1.id IN
             (
               SELECT DISTINCT id
               FROM MainQuery
             )
           ) sub2
   ON sub2.D = sub1.C

当我运行查询时,收到错误消息Invalid object name 'MainQuery'.当我在LEFT JOINs语句中注释SELECT及其提供的字段时,查询运行正常。我也尝试了AS MainQuery,但我得到了相同的结果。

我怀疑它与范围有关。我试图SELECT DISTINCT id FROM MainQuery的位置MainQuery WHERE范围内sub1子查询的范围是否超出范围?

对于上下文,我的任务是将使用临时表的查询重写为可在SSRS 2000上部署的报表中使用的查询。我的MainQuerysub1和{{ 1}}是原始查询中的临时表。那些临时表使用了它们中的子查询,我在翻译中保留了这些子查询。但原始查询的优点是分别创建每个临时表,然后加入结果。临时表和子查询对我来说是新的,所以我不确定如何在两者之间进行调整,或者这是否是正确的方法。

1 个答案:

答案 0 :(得分:3)

您的MainQuery的SQL无效。单独运行并查看:

SELECT A, id
   FROM myTable 
   WHERE conditions 
   GROUP BY A

您不能选择A和id,但只能选择A组。要么您还需要按ID分组,要么将id包装在聚合函数中,例如min或max。

如果解决了这个问题,看起来你的另一个问题就是你说“LEFT JOIN”,然后将你的LEFT JOINED表的列放在where子句的左侧。请参阅下面的内容,我在JOIN中翻转sub1.B和MainQuery.A。

SELECT   A
        ,B
        ,C
        ,D

FROM ( SELECT A, id
       FROM myTable 
       WHERE conditions 
       GROUP BY A,id) MainQuery
LEFT JOIN nutherTable sub1
on MainQuery.A = sub1.B
and MainQuery.id = sub1.id
LEFT JOIN (SELECT D ...) sub2
   ON sub1.C = sub2.D