簡體   English   中英

將訪問SQL轉換為MYSQL,如何進行If(isnull(Max(

[英]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練習和工作代碼示例。 在使用它時,請確保您了解MAXISNULL在MySQL中的工作方式。 (考慮改用IFNULLCOALESCE 。)

這是在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM