2015-06-02 59 views
0

我想写下面的更新语句;更新声明使用派生表

 UPDATE @eticat 
     SET eticat_purchase_total = t.eticat_purchase_total 
     FROM (
     SELECT eticat_id, COUNT(eticat_id) as eticat_purchase_count 
      FROM etransaction 
       INNER JOIN etransaction_item 
        INNER JOIN etransaction_item_catalog ON eti_eticat_id = eticat_id 
       ON eti_et_id = et_id 
     WHERE et_cmc_id = @can_cmc_id 
     GROUP by eticat_id 
     ) as t 
     WHERE eticat_id = t.eticat_id 

但它一直抱怨ambigous列。有人可以告诉我我做错了什么。

编辑:错误消息是“不明确的列名'eticat_id'。”

即线是 'WHERE eticat_id = t.eticat_id'

+0

您能否包含错误消息? – codingbiz

+1

您需要别名您的内部连接表,例如'INNER JOIN etransaction_item_catalog eic ON eic.eti_eticat_id = et.eticat_id' – codingbiz

+2

如果两个表包含相同的列名称,要在JOIN中使用它,则需要通过ALIAS引用该表,以便查询将知道您正在引用哪个表列 – codingbiz

回答

2

首先,这不是一个CTE;这是派生表。类似但不同:)

其次,你正在更新一个不包含在你的FROM子句中的表变量,这是令人困惑的SQL Server。尝试类似:

UPDATE x 
     SET eticat_purchase_total = t.eticat_purchase_total 
     FROM (
     SELECT eticat_id, COUNT(eticat_id) as eticat_purchase_count 
      FROM etransaction 
       INNER JOIN etransaction_item 
        INNER JOIN etransaction_item_catalog ON eti_eticat_id = eticat_id 
       ON eti_et_id = et_id 
     WHERE et_cmc_id = @can_cmc_id 
     GROUP by eticat_id 
     ) as t JOIN @eticat x ON x.eticat_id = t.eticat_id 
+1

表格变量未包含在FROM子句中的事实并未使SQL Server混淆。直接的问题是'@ eticat'和subselect都有一个'eticat_id'列,没有表别名,引用是不明确的。如果您正在更新普通表而不是表变量,那么您可以简单地修改WHERE子句:WHERE eticat.eticat_id = t.eticat_id'并解决问题。但是你不能用表变量来做到这一点:在这种情况下,@ eticat.eticat_id将是无效的语法。你需要为'@ eticat'分配一个别名,你的建议正好解决了这个问题。 –

+1

对不起,我的语言简写。 “混淆”和“模棱两可”是相似的概念,我觉得我不需要写出更完整的陈述。谢天谢地,你来这里是为了节省一天的时间。 –

+3

我不确定我是否理解。我对你使用“混淆”与“模糊”没有任何问题。我的问题在于你的陈述,即造成混淆的原因是因为'@ eticat'不在FROM子句中。不,混淆是由WHERE子句中的非限定列名引起的,因为该名称在涉及的两个数据集(表变量和子查询)中都存在。 –