1. ホーム
  2. sql

[解決済み] SQL 更新クエリ - 集約が UPDATE 文のセットリストに表示されない場合があります。

2022-02-18 18:56:17

質問

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)
);

NULL外部キーの問題は、これで解決できるかもしれません。

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);
    }

解決方法は?

クエリーはこのように書きます。

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;