组合查询时的 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 语法错误(传递查询)的主要内容,如果未能解决你的问题,请参考以下文章

将参数从访问传递到 sql-server

选择 id 为偶数的行

编写查询时的 SQL 语法错误

表创建时的 MySQL 语法错误

执行多个查询时的 Doctrine (DBAL) 错误处理

创建函数 SQL-Server 语法不正确