组合查询时的 SQL-server 语法错误(传递查询)
Posted
技术标签:
【中文标题】组合查询时的 SQL-server 语法错误(传递查询)【英文标题】:SQL-server syntax error when combining queries (pass-through query) 【发布时间】:2012-06-13 12:02:40 【问题描述】:我正在尝试将 2 个查询组合到一个 sql-server 直通查询 (PTQ)。当在 Access 中单独编码时,这两个查询都可以工作。将这些访问代码组合到一个查询时,它仍然可以在 Access 中使用。 但是,当我将字段名称格式化为 T-sql 并尝试作为 PTQ 运行时,我在“GROUP”附近收到语法错误。当我删除此“GROUP BY”行时,“;”附近出现语法错误。
SELECT jaar,
maand,
wicode,
pg_intern_code,
pg_kriss_code,
pg_kriss_naam,
Count(pc0517.dbo.resul.klavnr) AS AantalVanKLAVNR
FROM (SELECT Year(pc0517.dbo.resul.created) AS JAAR,
Month(pc0517.dbo.resul.created) AS MAAND,
pc0517.dbo.resul.wicode,
dbo.tblproductgroep_intern.pg_intern_code,
dbo.tblproductgroep_kriss.pg_kriss_code,
dbo.tblproductgroep_kriss.pg_kriss_naam,
pc0517.dbo.resul.klavnr
FROM (dbo.tblproductgroep_kriss
INNER JOIN (dbo.tblproductgroep_intern
INNER JOIN dbo.tblrobbe_pg
ON dbo.tblproductgroep_intern.pg_intern_id =
dbo.tblrobbe_pg.pg_code_intern_id)
ON dbo.tblproductgroep_kriss.pg_kriss_id =
dbo.tblrobbe_pg.pg_code_kriss_id)
INNER JOIN pc0517.dbo.resul
ON dbo.tblrobbe_pg.robbe_pg_naam =
pc0517.dbo.resul.prcode
WHERE ( ( Year(pc0517.dbo.resul.created) = 2012 )
AND ( pc0517.dbo.resul.kanaal = "gg" ) ))
GROUP BY jaar,
maand,
wicode,
pg_intern_code,
pg_kriss_code,
pg_kriss_naam;
同一数据库上的其他 PTQ (甚至与 PC0517 数据库结合使用),工作没有任何故障,但我对 SQL 服务器完全陌生,所以我还不知道所有的约定,并且可能忽略了一些东西基本...
TIA
【问题讨论】:
TSQL 不喜欢双引号。将“gg”更改为“gg”。 呃,Access 做了一些讨厌的东西。 感谢更改格式的人 :) 讨厌的东西也可能是由于我必须合并大量表(不是我的数据库)... 【参考方案1】:我纠正了很多事情:(1) 将连接按正确的顺序排列 (2) 删除了放错位置的括号 (3)
为可读性添加了表别名 (4) 删除了 "gg"
周围的双引号 (5) 对 r.created 进行了查询。创建了一个开放式范围,以便在存在索引时可以使用它。我还从分组的内部查询中删除了 jaar
- 基于 where 子句,这不能是 2012
以外的任何内容。
如果您将 Access 粘贴回那里,我不知道 Access 会对此做什么,但您应该能够确认这是一个比直接针对 SQL Server 运行它为您生成的垃圾 Access 更正确的查询。如果 Access 仍然破坏了这一点,我会将其放在 SQL Server 中的存储过程或视图中,然后将 Access 指向那里。
SELECT
jaar = 2012,
maand,
wicode,
pg_intern_code,
pg_kriss_code,
pg_kriss_naam,
COUNT(klavnr) AS AantalVanKLAVNR
FROM
(
SELECT
maand = MONTH(r.created),
r.wicode,
i.pg_intern_code,
k.pg_kriss_code,
k.pg_kriss_naam,
r.klavnr
FROM
dbo.tblproductgroep_kriss AS k
INNER JOIN dbo.tblrobbe_pg AS tr
ON k.pg_kriss_id = tr.pg_code_kriss_id
INNER JOIN dbo.tblproductgroep_intern AS i
ON i.pg_intern_id = tr.pg_code_intern_id
INNER JOIN pc0517.dbo.resul AS r
ON tr.robbe_pg_naam = r.prcode
WHERE
r.created >= '20120101' AND r.created < '20130101'
AND r.kanaal = 'gg'
) AS x
GROUP BY
maand,
wicode,
pg_intern_code,
pg_kriss_code,
pg_kriss_naam;
也可以简化为:
SELECT
jaar = 2012,
maand = MONTH(r.created),
r.wicode,
i.pg_intern_code,
k.pg_kriss_code,
k.pg_kriss_naam,
r.klavnr
FROM
dbo.tblproductgroep_kriss AS k
INNER JOIN dbo.tblrobbe_pg AS tr
ON k.pg_kriss_id = tr.pg_code_kriss_id
INNER JOIN dbo.tblproductgroep_intern AS i
ON i.pg_intern_id = tr.pg_code_intern_id
INNER JOIN pc0517.dbo.resul AS r
ON tr.robbe_pg_naam = r.prcode
WHERE
r.created >= '20120101' AND r.created < '20130101'
AND r.kanaal = 'gg'
GROUP BY
MONTH(r.created),
r.wicode,
i.pg_intern_code,
k.pg_kriss_code,
k.pg_kriss_naam;
(换句话说,子查询似乎没有必要。)
【讨论】:
这就像一个魅力。非常感谢您抽出宝贵时间!以上是关于组合查询时的 SQL-server 语法错误(传递查询)的主要内容,如果未能解决你的问题,请参考以下文章