[英]Converting access SQL to MYSQL, How to If(isnull(Max( a column on Insert
这里的初学者。 我将Access sql转换为MYSQL,因此我可以运行bash文件,并且遇到了1个问题,其中3天的网络搜索导致我无处可去。
我有一个包含两个主要字段的表,“ SalesOrderId”和“ SOItemID”,因此该表可能如下所示:
+--------------+----------+--------+
| SalesOrderid | SOItemId | PartId |
+--------------+----------+--------+
| 10001 | 1 | 147 |
| 10002 | 1 | 152 |
| 10003 | 1 | 152 |
| 10003 | 2 | 188 |
| 10004 | 1 | 105 |
| 10004 | 2 | 84 |
| 10004 | 3 | 209 |
| 10005 | 1 | 5 |
+--------------+----------+--------+
插入时,我需要检查SalesOrderId是否存在,如果存在,则+1 SOItemId字段并插入新记录。 如果不是,则将SOItemId插入为1。因此,如果要向SalesOrderId#10004插入另一个PartId,则将其插入为(10004, 4, 299)
10004,4,299 (10004, 4, 299)
这是Access SQL当前有效的代码。
SQL代码:
INSERT INTO SOItem ( SalesOrderId, SOItemId, PartId, CustDeliv, OnDate, Qty, UnitAmount, WebOrderProductId )
SELECT SalesOrder.SalesOrderId, If(IsNull(Max(`SOItemId`,"SOItem","SalesOrderId= " & [SalesOrderId] & " ")),1,DMax("[SOItemId]","SOItem","SalesOrderId= " & [SalesOrderId] & " ")+1) AS Expr1, ICS_Web_Parts_Link.PartId, SalesOrder.Date, SalesOrder.Date, order_product.quantity, order_product.price, order_product.order_product_id
FROM (order_product INNER JOIN ICS_Web_Parts_Link ON order_product.model = ICS_Web_Parts_Link.Model) INNER JOIN SalesOrder ON order_product.order_id = SalesOrder.WebOrderId;
这是我的MYSQL版本:
INSERT INTO `SOItem` ( SalesOrderId, SOItemId, PartId, CustDeliv, OnDate, Qty, UnitAmount, WebOrderProductId )
SELECT `SalesOrder`.`SalesOrderId`, If(IsNull(Max(`SOItem`.`SOItemId`, `SOItemId`.`SalesOrderId` = `SalesOrder`.`SalesOrderId`)),1,Max(`SOItem`.`SOItemId`, `SOItemId`.`SalesOrderId` = SalesOrder`.`SalesOrderId`)+1) AS Expr1, ICS_Web_Parts_Link.PartId, SalesOrder.Date, SalesOrder.Date, order_product.quantity, order_product.price, order_product.order_product_id
FROM (order_product INNER JOIN ICS_Web_Parts_Link ON order_product.model = ICS_Web_Parts_Link.Model) INNER JOIN SalesOrder ON order_product.order_id = SalesOrder.WebOrderId;
我收到此错误:
#1064-您的SQL语法有误; 查看与您的MySQL服务器版本相对应的手册,以在' SOItemId
'附近使用正确的语法。 SalesOrderId
= SalesOrder
。 SalesOrderId
)),1,Max( SOItem
.`SOIte'第2行
任何帮助将不胜感激。 -担
语法SOItemId.SalesOrderId
表示您正在引用名为SOItemId
的表,该表具有名为SalesOrderId
的列。 显然,这不是您正在做的事情(没有该名称的表,至少没有加入该查询),所以这就是它向您抛出语法错误的原因。
目前尚不清楚您正在尝试加入什么。 我建议您花更多时间看一下SQL练习和工作代码示例。 在使用它时,请确保您了解MAX
和ISNULL
在MySQL中的工作方式。 (考虑改用IFNULL
或COALESCE
。)
这是在MySQL中执行此操作的方法。 这只是使用上面引用的示例,但是您可以按原样执行它,以查看其工作原理,然后将其应用于用例。
DROP TABLE IF EXISTS sales_test;
CREATE TABLE `sales_test` (
`SalesOrderid` int(11) DEFAULT NULL,
`SOItemId` int(11) DEFAULT NULL,
`PartId` int(11) DEFAULT NULL,
PRIMARY KEY (SalesOrderid, SOItemId),
UNIQUE KEY `SalesOrderid` (`SalesOrderid`,`SOItemId`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO sales_test (SalesOrderid, SOItemId, PartId) VALUES
(10001, 1, 147),
(10002, 1, 152),
(10003, 1, 152),
(10003, 2, 188),
(10004, 1, 105),
(10004, 2, 84),
(10004, 3, 209),
(10005, 1, 5);
SELECT * FROM sales_test;
INSERT INTO sales_test (SalesOrderid, SOItemId, PartId)
VALUES (10005, 1, 5)
ON DUPLICATE KEY UPDATE SOItemId = SOItemId + 1;
SELECT * FROM sales_test;
我终于能够弄清楚了。 感谢你的帮助! 对于有相同问题的任何人,这是有效的mysql代码。
INSERT INTO `SOItem` ( SalesOrderId, SOItemId, PartId, CustDeliv, OnDate, Qty, UnitAmount, WebOrderProductId )
SELECT `SalesOrder`.`SalesOrderId`, IF((SELECT (SOItem.SOItemId) FROM d1.SOItem WHERE SalesOrder.SalesOrderId = SOItem.SalesOrderId) IS NULL, 1, (SELECT MAX(SOItem.SOItemId)+1 FROM d1.SOItem WHERE SalesOrder.SalesOrderId = SOItem.SalesOrderId)) AS Expr1, ICS_Web_Parts_Link.PartId, SalesOrder.Date, SalesOrder.Date, order_product.quantity, order_product.price, order_product.order_product_id
FROM d2.order_product INNER JOIN d1.ICS_Web_Parts_Link ON order_product.model = ICS_Web_Parts_Link.Model INNER JOIN d1.SalesOrder ON order_product.order_id = SalesOrder.WebOrderId LEFT JOIN d1.SOItem ON order_product.order_product_id = SOItem.WebOrderProductId
WHERE NOT EXISTS (SELECT order_product_id FROM d2.order_product WHERE order_product.order_product_id = SOItem.WebOrderProductId);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.