VBA SQL右连接-连接操作中的语法错误

时间:2018-12-04 13:45:38

标签: sql excel vba

我正在尝试在Excel VBA中右联接子查询,但是我一直收到语法错误。谁能看到它?

SELECT c.Category
FROM [Catalogue Info] as c

RIGHT JOIN (
SELECT [Product Code]
FROM Orders
WHERE JSID = 10503001
AND [Delivery Date] >= 04/12/2017
GROUP BY [Product Code]
) AS o ON c.code = o.[Product Code]

WHERE c.Brand='Brand'
AND c.Category<>''
GROUP BY c.Category
ORDER BY Avg(c.Page) Asc;

Excel 2016年 Windows 10

---编辑---

这是VBA中产生上述查询的实际代码

sqlProdList = " RIGHT JOIN" _
    & " (SELECT [Product Code]" _
    & " FROM Orders" _
    & " WHERE JSID = " & customerRef _
    & " AND [Delivery Date] >= " & Date - 365 _
    & " GROUP BY [Product Code]) as o on c.code = o.[Product Code]"

sqlCategory = "SELECT c.Category" _
    & " FROM [Catalogue Info] as c" _
    & sqlProdList _
    & " WHERE c.Brand='Brand'" _
    & " AND c.Category<>''" _
    & " GROUP BY c.Category" _
    & " ORDER BY Avg(c.Page) Asc;"

这是表格的样子:

Catalogue Info Table Details

Order Table Details

4 个答案:

答案 0 :(得分:0)

我怀疑您想要的查询更像这样:

SELECT c.Category
FROM [Catalogue Info] as c LEFT JOIN 
     [Product Code]
     o.Orders o
     ON c.code = o.[Product Code] AND
        o.JSID = 10503001 AND
        [Delivery Date] >= '2017-04-12'
WHERE c.Brand = 'Brand' AND c.Category <> ''
GROUP BY c.Category
ORDER BY Avg(c.Page) Asc;

注意:

  • 这使用了LEFT JOIN
  • 它修复了日期格式。
  • 它将删除子查询。

答案 1 :(得分:0)

日期值之前必须带有#号。

qlProdList = " RIGHT JOIN" _
    & " (SELECT [Product Code]" _
    & " FROM Orders" _
    & " WHERE JSID = " & customerRef _
    & " AND [Delivery Date] >=#" & Date - 365 _
    & "# GROUP BY [Product Code]) as o on c.code = o.[Product Code]"

sqlCategory = "SELECT c.Category" _
    & " FROM [Catalogue Info] as c " _
    & sqlProdList _
    & " WHERE c.Brand='Brand'" _
    & " AND c.Category<>''" _
    & " GROUP BY c.Category" _
    & " ORDER BY Avg(c.Page) Asc;"

答案 2 :(得分:0)

阅读关于OP的注释以获取调试帮助。

问题在于日期格式。从Excel VBA传递到Access的问题查询为AND [Delivery Date] >= 04/12/2017

Access会将日期解释为数学,因此对2017年4月12日进行评估,而不是将其视为日期字段。

DateAdd("d", -365, Date())作为字符串传递给查询是为了允许Access评估它自己的日期参数。

最终工作代码

SQL

SELECT c.Category
FROM [Catalogue Info] as c

RIGHT JOIN (
SELECT [Product Code]
FROM Orders
WHERE JSID = 10503001
AND [Delivery Date] >= DateAdd("d", -365, Date())
GROUP BY [Product Code]
) AS o ON c.code = o.[Product Code]

WHERE c.Brand='Brand'
AND c.Category<>''
GROUP BY c.Category
ORDER BY Avg(c.Page) Asc;

VBA

sqlProdList = " RIGHT JOIN" _
        & " (SELECT [Product Code]" _
        & " FROM Orders" _
        & " WHERE JSID = " & customerRef _
        & " AND [Delivery Date] >= DateAdd('d', -365, Date())" _
        & " GROUP BY [Product Code]) AS o ON (c.code = o.[Product Code])"

sqlCategory = "SELECT c.Category" _
        & " FROM [Catalogue Info] as c" _
        & sqlProdList _
        & " WHERE c.Brand='Brand'" _
        & " AND c.Category<>''" _
        & " GROUP BY c.Category" _
        & " ORDER BY Avg(c.Page) Asc;"

答案 3 :(得分:-1)

也许是“ SELECT c.Category 从[Catalog Info]作为c“进入c.code字段。