小编典典

SQL更新查询-聚合可能不会出现在UPDATE语句的设置列表中

sql

我正在尝试编写一个查询,该查询使用HOLIDAY_DATE_TABLE中最高的主键值(HID)更新tbl8_update_transactions
HID字段(其中为null)。我收到以下错误

“聚合可能不会出现在UPDATE语句的设置列表中”

我读到我需要使用子查询来完成此操作,但需要帮助。谢谢

USE BillingUI;
UPDATE tbl8_update_transactions
SET tbl8_update_transactions.HID = MAX(HOLIDAY_DATE_TABLE.HID)
FROM HOLIDAY_DATE_TABLE
WHERE tbl8_update_transactions.HID = NULL;

更新: 尝试了建议的解决方案

UPDATE tbl8_update_transactions
SET HID = h.maxHID
FROM (select max(HOLIDAY_DATE_TABLE.HID) as maxHID from HOLIDAY_DATE_TABLE) h
WHERE tbl8_update_transactions.HID IS NULL;

不幸的是,这会影响0行/不起作用。我认为这是因为HID是外键(在中tbl8_update_transactions)。真正的问题似乎是我的C#方法,用于将记录插入表中(它在不填充外键的情况下插入行)。我想使用触发器而不是C#代码来处理它。我的表格如下。

USE BillingUI;
CREATE TABLE HOLIDAY_DATE_TABLE
(
HID INT IDENTITY PRIMARY KEY,
TABLE_NUMBER nchar(2) NOT NULL,
HOLIDAY_DATE nchar(8) NOT NULL,
FIELD_DESCRIPTION nVARchar(43) NULL,
);

USE BillingUI;
CREATE TABLE tbl8_update_transactions
(
TID INT IDENTITY PRIMARY KEY,
TABLE_NUMBER nchar(2) NOT NULL,
HOLIDAY_DATE nchar(8) NOT NULL,
FIELD_DESCRIPTION nVARchar(43) NULL,
HID int,
FOREIGN KEY (HID) REFERENCES HOLIDAY_DATE_TABLE (HID)
);

我认为这可以解决空外键问题,如果我可以得到帮助的话

CREATE TRIGGER tbl8_ins
ON HOLIDAY_DATE_TABLE
FOR INSERT
AS
BEGIN
INSERT INTO tbl8_update_transactions
SELECT * FROM HOLIDAY_DATE_TABLE
WHERE HID = MAX(HID);
END

如果您想看到我的C#代码成功执行插入,但没有填充外键

 public ActionResult Create()
    {
        return View();
    }

    //
    // POST: /Table8/Create

    [HttpPost]
    public ActionResult Create(HOLIDAY_DATE_TABLE holiday_date_table, tbl8_update_transactions tbl8_update_transaction)
    {
        if (ModelState.IsValid)
        {
            db.HOLIDAY_DATE_TABLE.Add(holiday_date_table);
            db.SaveChanges();
            db.tbl8_update_transactions.Add(tbl8_update_transaction);
            db.SaveChanges();
            return RedirectToAction("../Billing/HolidayDateTable");
        }
        return View(holiday_date_table);
    }

阅读 309

收藏
2021-04-22

共1个答案

小编典典

您可以这样编写查询:

UPDATE tbl8_update_transactions
    SET HID = h.maxHID
    FROM (select max(HOLIDAY_DATE_TABLE.HID) as maxHID from HOLIDAY_DATE_TABLE) h
    WHERE tbl8_update_transactions.HID IS NULL;

我发现使用from子句而不在那里提到主表会令人困惑。我更喜欢这样写:

UPDATE ut
    SET HID = h.maxHID
    FROM tbl8_update_transactions ut CROSS JOIN
         (select max(HID) as maxHID from HOLIDAY_DATE_TABLE) h
    WHERE ut.HID IS NULL;
2021-04-22