我遇到了语法错误“'* ='附近的语法不正确”。

时间:2018-07-19 22:32:29

标签: sql-server

我尝试多次修复该代码,但我不知道该语法对于SQL Server 2012无效。因此,请修复

WHERE 
    invoice_register.trans_type_id IN (1, 2, 3, 6, 7, 8, 9) AND
    invoice_register.store_id = invoice_detail.store_id AND
    invoice_register.invoice_register_id = invoice_detail.invoice_register_id AND
    ii.item_id = invoice_detail.item_id AND
    ii.style_master_id *= sm.style_master_id AND /*Incorrect Syntax*/
    (@a_category_id = -9999 OR ii.category_id = @a_category_id ) AND
    (@a_store_id is NULL OR invoice_register.store_id = @a_store_id ) AND
    (invoice_register.trans_date between @a_Start_Date and @a_End_Date)) A
GROUP BY 
    A.store_id, A.category_id,
    A.type_id, A.item_id, A.item_code,
    A.name, A.cost, A.price_sold,
    A.manufacturer, A.style_number,
    A.comments, A.UPC

请修正我的语法。我认为我的语法很旧

1 个答案:

答案 0 :(得分:0)

这里有三点:

首先,您正在向我们展示子查询的一部分和外部查询-您应该缩进子查询以提高可读性。

第二,关于可读性,对于子查询,您应该使用比A更有意义的名称。

正如注释中指出的,主要问题是您正在使用旧的非ANSI标准语法来连接表。与其将信息放入WHERE子句中,不如将其放在JOIN子句中,并将WHERE子句保留为实际记录级过滤条件。

您的from子句应如下所示:

FROM
    invoice_register
    INNER JOIN invoice_detail ON invoice_register.invoice_register_id = invoice_detail.invoice_register_id
    INNER JOIN ii ON ii.item_id = invoice_detail.item_id
    LEFT JOIN sm ON ii.style_master_id = sm.style_master_id

然后从WHERE子句中删除所有这些条件。

大概ii和sm是stockstock_item和style_master的别名-调整FROM子句以适合。

不要低估关于过滤条件(WHERE)与联接条件(FROM)和聚合条件(HAVING)的概念分离点。当您指出自己的意图时,这对于读者来说会更清楚。