2012-05-02 74 views
0

在下面的查询中,我尝试使用左侧外部联接中的第一个表格。但是我收到一个错误。如何访问左外部联接中的外部表格

SELECT 
     products.id, 
     products_cstm.oem_c, 
     products.mfr_part_num, 
     products.description, 
     products.cost, 
     products.assigned_user_id, 
     customfields_oo.ans 
FROM products 
      LEFT OUTER JOIN (SELECT COUNT(q.id) AS ans 
            , pq.product_id 
          FROM products_quotes pq 
            LEFT JOIN quotes q 
              ON pq.quote_id = q.id 
          WHERE q.deleted = 0 
          AND pq.deleted = 0 
          AND q.stage <> 4 
          AND (pq.qty_shipped < pq.product_qty) 
          AND pq.product_id = products.id 
          GROUP BY pq.product_id 
        ) AS customfields_oo 
       ON customfields_oo.product_id = products.id 
      LEFT JOIN products_cstm 
       ON products.id = products_cstm.id_c 
WHERE products.deleted = 0 
ORDER BY ans DESC 

当我运行查询它给了我下面的错误:

Error Code : 1054 
Unknown column 'products.id' in 'where clause' 

这是不允许第一个“产品”表中左外连接查询。

回答

1

问题是是派生表不相关子查询。因此,您不能从派生表的定义中引用外部表。在这种情况下,您无法参照定义中的外部products表。相反,您必须在dervied表定义之外的On子句中执行该过滤器。

Select products.id, 
     products_cstm.oem_c, 
     products.mfr_part_num, 
     products.description, 
     products.cost, 
     products.assigned_user_id, 
     customfields_oo.ans 
FROM products 
    Left Join (
       Select pq1.product_id 
        , Count(q1.id) As ans 
       From products_quotes As pq1 
        Left Join quotes As q1 
         On pq1.quote_id = q1.id 
       Where q1.deleted = 0 
        And pq1.deleted = 0 
        And q1.stage <> 4 
        And pq1.qty_shipped < pq1.product_qty 
       Group By pq1.product_id 
       ) As customfields_oo 
     On customfields_oo.product_id = products.id 
    Left Join products_cstm 
     On products.id = products_cstm.id_c 
Where products.deleted = 0 
Order By customfields_oo.ans Desc 

现在,你已经在注释中说明这是太慢了,因为,说哪里删除<> 0可能会在派生表来评估产品。如果是这种情况,那么只需展开派生表以在外部products表中包括过滤器。

Select products.id, 
     products_cstm.oem_c, 
     products.mfr_part_num, 
     products.description, 
     products.cost, 
     products.assigned_user_id, 
     customfields_oo.ans 
FROM products 
    Left Join (
       Select pq1.product_id 
        , Count(q1.id) As ans 
       From products_quotes As pq1 
        Join products As p1 
         On p1.products.id = pq1.product_id 
        Left Join quotes As q1 
         On pq1.quote_id = q1.id 
       Where q1.deleted = 0 
        And pq1.deleted = 0 
        And q1.stage <> 4 
        And pq1.qty_shipped < pq1.product_qty 
        And p1.deleted = 0 
       Group By pq1.product_id 
       ) As customfields_oo 
     On customfields_oo.product_id = products.id 
    Left Join products_cstm 
     On products.id = products_cstm.id_c 
Where products.deleted = 0 
Order By customfields_oo.ans Desc 
+0

它会评估customfields_oo查询只有一次或外部主要选择查询的每一行? –

+0

@DhavalDarji - 它将评估'customfields_oo'查询一次,然后将该结果集连接到外部查询。因此,内部查询执行一次,合并/连接/散列(取决于优化引擎)结果到外部表(“产品”)。 – Thomas

+0

谢谢。查询执行罚款上述计算,但如果我想从报价表计算那些具有当前产品的最后一个订单日期,我必须传递customfield_oo查询中的当前产品ID其他它正在计算错误的结果(即它是基于所有产品)。 –

1

你不需要在where语句中有AND pq.product_id = products.id。因为你是LEFT JOIN。所以,我认为这样的事情会工作:

AND (pq.qty_shipped < pq.product_qty) 
GROUP BY pq.product_id) AS customfields_oo 
ON customfields_oo.product_id = products.id 
LEFT JOIN products_cstm 
    ON products.id = products_cstm.id_c 
WHERE products.deleted = 0 
ORDER BY openorder DESC 

编辑

你不需要LEFT JOIN在桌子上,你是COUNT荷兰国际集团上。你也可以做催产素是这样的:

SELECT 
    ..... 
    (
     SELECT 
      COUNT(q.id) 
     FROM products_quotes pq 
     LEFT JOIN quotes q 
      ON pq.quote_id = q.id 
     WHERE q.deleted = 0 
     AND pq.deleted = 0 
     AND q.stage <> 4 
     AND (pq.qty_shipped < pq.product_qty) 
     AND pq.product_id = products.id 
    ) AS ans 
FROM products 
..... 
+0

如果我删除“并pq.product_id = products.id”,那么该查询将工作,但那么它会计算公式为每个产品行,然后挑选匹配“ON customfields_oo.product_id =产品1排.id“当前产品,但认为我为5000个产品执行此操作时,它会计算每个5000次迭代的每个产品行!谢谢,因为你回复我试过这个,但是对于其他的计算,它给出错误的结果,所以我必须把这个条件和交替的方式。 –

+0

更新了你的答案 – Arion

+0

是的,这将做任务,但我不能使用这种语法,因为它会创建其他计数查询问题,因为我在sugarcrm上工作有限制主查询中的子查询。 :) –