it-swarm.com.de

Mehrfachaktualisierung mit mehreren Bedingungen

Wir werden angewiesen, auf Dinge zu achten, die auf null gesetzt werden (wir wollen nicht), indem wir die IN-Klausel im Folgenden verwenden:

UPDATE Tests SET
     TestScore =
              CASE
                  WHEN TestId = 10 THEN 1000
                  WHEN TestId = 11 THEN 1100
              END,
     TestScore2 =
              CASE
                  WHEN TestId = 10 THEN 2000
                  WHEN TestId = 11 THEN 2100
              END
     WHERE TestId IN (10, 11)

Aber was passiert, wenn zwei Bedingungen erforderlich sind, nämlich die gemeinsame Kombination von (TestId, TestSubId)? Dh was mache ich für die IN-Klausel, die ???, im Folgenden, um zu zeigen, dass sie in den Combos (10,25) und (11,22) enthalten sein muss:

UPDATE Tests SET
    TestScore = CASE
        WHEN (TestId = 10 AND TestSubId = 25) THEN 1000
        WHEN (TestId = 11 AND TestSubId = 22) THEN 1100
    END,
    TestScore2 = CASE
        WHEN (TestId = 10 AND TestSubId = 25) THEN 2000
        WHEN (TestId = 11 AND TestSubId = 22) THEN 2100
    END
    WHERE TestId, TestSubId IN ?????
4
Rewind

In MySQL können Sie den Tupelvergleich verwenden:

WHERE (TestId, TestSubId) IN ((10,25), (11,22))

Das sieht gut und prägnant aus, obwohl es, wie ypercubeᵀᴹ in einem Kommentar erwähnt, in Bezug auf die Leistung möglicherweise nicht gut funktioniert.

Angesichts der Wiederverwendung der Bedingungen in Ihrer UPDATE-Anweisung können Sie jedoch auch einen anderen Ansatz wählen: Stellen Sie die betroffenen IDs und die neuen Werte als abgeleitete Tabelle dar und verwenden Sie ein Update mit einem Join:

UPDATE
    Tests AS old
    INNER JOIN
    (
        SELECT 10 AS TestId, 25 AS TestSubId, 1000 AS TestScore, 2000 AS TestScore2
        UNION ALL
        SELECT 11, 22, 1100, 2100
    ) AS new
    ON old.TestId = new.TestId AND old.TestSubId = new.TestSubId
SET
    old.TestScore  = new.TestScore,
    old.TestScore2 = new.TestScore2
;

Auf diese Weise fungiert die von new abgeleitete Tabelle sowohl als Filter für Tests als auch als Lieferant neuer Werte für die Aktualisierung.

6
Andriy M

Sie können den Operator in nicht verwenden, um zwei verschiedene Spalten zu filtern. In diesem Beispiel müssten Sie die logischen Standardoperatoren verwenden:

UPDATE Tests SET
TestScore = CASE
    WHEN (TestId = 10 AND TestSubId = 25) THEN 1000
    WHEN (TestId = 11 AND TestSubId = 22) THEN 1100
END,
TestScore2 = CASE
    WHEN (TestId = 10 AND TestSubId = 25) THEN 2000
    WHEN (TestId = 11 AND TestSubId = 22) THEN 2100
END
WHERE (TestId = 10 AND TestSubId = 25)
  OR (TestId = 11 AND TestSubId = 22)
2
Rich Theobald