Announcement

Collapse
No announcement yet.

Update mit Unterabfrage funktioniert nicht

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Update mit Unterabfrage funktioniert nicht

    Hallo Zusammen,
    ich hab mal wieder ein Problem.
    Ich habe ein Feld mit Sekunden gefüllt. Nun möchte ich diese Sekunden in einem Feld Namens Stunden und das natürlich auch umgerechnet.
    Das Ganze funktioniert so:
    UPDATE AbReKurz
    SET AbReKurz.Stunden = (SELECT TOP (1) CONVERT(VARCHAR(8),DATEADD(SECOND,AbReKurz.RSekund en, '00:00:00'), 108)
    FROM AbReKurz)
    GO
    Nun Sind da aber mehrere Datensätze.
    Also mache ich:
    UPDATE AbReKurz
    SET AbReKurz.Stunden = (SELECT CONVERT(VARCHAR(8),DATEADD(SECOND,AbReKurz.RSekund en, '00:00:00'), 108)
    FROM AbReKurz)
    GO
    Und da ist das Problem. Wenn ich ‚TOP (1)’ rausnehme um alle Datensätze zu bearbeiten kommt folgende Fehlermeldung

    Meldung 512, Ebene 16, Status 1, Zeile 3
    Die Unterabfrage hat mehr als einen Wert zurückgegeben. Das ist nicht zulässig, wenn die Unterabfrage auf =, !=, <, <=, > oder >= folgt oder als Ausdruck verwendet wird

    Da ich keine Ahnung habe was ich nun machen muss wäre ich Euch Dankbar wenn mir jemand einen Tipp geben könnte um das Problem zu lösen.
    Gruß
    Athos

  • #2
    Hallo,

    bei der verwendeten Syntax des UPDATE-Aufrufs erhalten alle Datensätze den gleichen Wert für die Spalte Stunden, daher muss der Wert eindeutig sein (TOP(1)).

    Wenn jeder Datensatz der Tabelle in der Spalte Stunden einen der Spalte Sekunden entsprechenden Eintrag haben soll, muss die folgende Syntax verwendet werden:

    <div style="font-family: Courier New; font-size: 10pt; color: black; background: white; border-top: windowtext 1pt solid; padding-top: 0pt; border-left: windowtext 1pt solid; padding-left: 0pt; border-right: windowtext 1pt solid; padding-right: 0pt; border-bottom: windowtext 1pt solid; padding-bottom: 0pt;"><p style="margin: 0px;"><span style="color: blue;">USE </span>tempdb</p><p style="margin: 0px;">GO</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;"><span style="color: blue;">IF OBJECT_ID</span>(<span style="color: #a31515;">'AbReKurz'</span>) <span style="color: blue;">IS NOT NULL</span></p><p style="margin: 0px;">&nbsp; <span style="color: blue;">DROP TABLE </span>AbReKurz;</p><p style="margin: 0px;">GO</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;"><span style="color: blue;">CREATE TABLE </span>AbReKurz</p><p style="margin: 0px;">(</p><p style="margin: 0px;">&nbsp; id&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; <span style="color: blue;">INT </span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; <span style="color: blue;">NOT NULL IDENTITY PRIMARY KEY</span>,</p><p style="margin: 0px;">&nbsp; sekunden <span style="color: blue;">INT </span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; <span style="color: blue;">NOT NULL</span>,</p><p style="margin: 0px;">&nbsp; stunden&nbsp; <span style="color: blue;">VARCHAR</span>(8) <span style="color: blue;">NULL</span></p><p style="margin: 0px;">)</p><p style="margin: 0px;">GO</p><p style="margin: 0px;"><span style="color: blue;">INSERT INTO </span>dbo.AbReKurz(sekunden) <span style="color: blue;">VALUES </span>(60*59);</p><p style="margin: 0px;"><span style="color: blue;">INSERT INTO </span>dbo.AbReKurz(sekunden) <span style="color: blue;">VALUES </span>(60*60);</p><p style="margin: 0px;"><span style="color: blue;">INSERT INTO </span>dbo.AbReKurz(sekunden) <span style="color: blue;">VALUES </span>(60*61);</p><p style="margin: 0px;">GO</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;"><span style="color: green;">-- Correlated Subquery aktualisiert jeden Datensatz mit dem korrekten Wert</span></p><p style="margin: 0px;"><span style="color: blue;">UPDATE </span>dbo.AbReKurz </p><p style="margin: 0px;"><span style="color: blue;">SET </span>stunden = (<span style="color: blue;">SELECT CONVERT</span>(<span style="color: blue;">VARCHAR</span>(8),</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; <span style="color: blue;">DATEADD</span>(<span style="color: blue;">SECOND</span>,b.sekunden, <span style="color: #a31515;">'00:00:00'</span>), 108)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; <span style="color: blue;">FROM </span>dbo.AbReKurz b <span style="color: blue;">WHERE </span>b.id = AbReKurz.id)</p><p style="margin: 0px;">GO </p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;"><span style="color: blue;">SELECT </span>* <span style="color: blue;">FROM </span>dbo.AbReKurz;</p><p style="margin: 0px;">GO</p></div>

    Comment


    • #3
      Hallo Andreas,
      konnte erst heute wieder nachschauen. Vielen Dank für Deinen Beitrag. Ich werde es sofort testen.
      Gruß
      Athos

      Comment

      Working...
      X