访问:在Alias字段上查询加入

时间:2013-07-19 19:47:12

标签: sql ms-access

我正在尝试使用查询中的函数加入别名字段。这在MS Access中是否可行?

SELECT Mid([StockNum],1,9) AS StockTrim
FROM POs LEFT JOIN [STOCK DICTIONARY] 
    ON POs.[StockTrim] = [STOCK DICTIONARY].[Stock]
GROUP BY Mid([StockNum],1,9), [STOCK DICTIONARY].Stock
HAVING ((([STOCK DICTIONARY].Stock) Is Null));

在此示例中,我尝试加入计算字段 StrockTrim ,但Access会显示"输入参数值" POs.StockTrim的输入框

2 个答案:

答案 0 :(得分:3)

有时您可以在查询中使用别名,有时则不能。在您的情况下,以下应该可以工作(我还将GROUP BY / HAVING字段清理为更合适的WHERE子句):

SELECT Mid([StockNum],1,9) AS StockTrim
FROM POs LEFT JOIN [STOCK DICTIONARY] 
  ON Mid(POs.[StockNum],1,9) = [STOCK DICTIONARY].[Stock]
WHERE [STOCK DICTIONARY].Stock Is Null
GROUP BY Mid([StockNum],1,9)

了解何时可以在Access查询中使用别名,何时不能使用别名是一种黑暗艺术。一般来说,如果在查询计划中稍后出现别名,则可以使用别名。例如,您可以使用:

SELECT Mid([StockNum],1,9) AS StockTrim, "Trim #:" & StockTrim AS StockTrimNumber

StockTrimNumber字段稍后出现在该样本SELECT子句中,而不是StockTrim计算字段,可以在其自己的字段定义中使用StockTrim计算字段。

在您的情况下,连接发生在计算或返回任何字段之前,因此您需要在JOIN子句中重复字段定义。

同样,如果您想根据计算字段进行过滤,则需要使用字段定义本身(例如WHERE Mid([StockNum],1,9) LIKE "???XYZ???"),但仅使用别名会失败(例如WHERE StockTrim Like "???XYZ???")。

答案 1 :(得分:0)

既然你接受了mwolfe02的好答案,我希望问题得到解决。我想指出,由于StockTrim是一个直接构造,而不是POs中的字段,因此您可能遇到以下问题:

ON POs.[StockTrim] = [STOCK DICTIONARY].[Stock]

您可能会成功:

ON [StockTrim] = [STOCK DICTIONARY].[Stock]

假设StockTrim中没有名为STOCK DICTIONARY的字段。

暂且不说 - 如果你避免在对象的名称中使用空格,包括表和查询,那么你在Access中会更好。例如,STOCK DICTIONARY将更好地用作STOCK_DICTIONARY