我尝试多次修复该代码,但我不知道该语法对于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
请修正我的语法。我认为我的语法很旧
答案 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
)的概念分离点。当您指出自己的意图时,这对于读者来说会更清楚。