none
Bei Lerem Feld Wert einer anderen Spaöte Setzen RRS feed

  • Frage

  • Hallo erst mal, ich habe folgende Abfrage:

    use DB
    select Ob_ID,B_intAbk,Ob_F2,B_DatVon,B_DatBis,Ob_F1, Ob_f20,Ob_F30,Ob_f31

    FROM M_Objekte1 INNER JOIN M_Bestaende ON M_Objekte1.B_ID = M_Bestaende.B_ID
    WHERE 
      B_intAbk Like '%341-04 Adopt%'
      AND OB_F31 IS NULL

    ORDER BY Ob_F2


    Hiermit filter ich in meiner Datenbank die Datensätze die im Feld ob_F31 keinen Wert haben, wie kann ich diese auf Ob_F30 setzen, eventuell geht das ja mit dem Set Befehl irgendwie?


    Vielen Dank i.V.

    Gruss

    Chris


    • Bearbeitet Chris4712 Dienstag, 10. Juli 2018 12:27
    Dienstag, 10. Juli 2018 12:27

Antworten

  • Oder probiere mal ein UPDATE ... FROM

    update M
     set Ob_F31 = M.Ob_F30
    from M_Objekte1 M
    INNER JOIN M_Bestaende 
    	ON M_Objekte1.B_ID = M_Bestaende.B_ID
    where OB_F31 IS NULL 
    AND B_intAbk Like '%341%';

    HTH!


    Einen schönen Tag noch, Christoph -- Data Platform MVP - http://www.insidesql.org/blogs/cmu

    Mittwoch, 11. Juli 2018 06:57
  • Hi,

    nuja, niemand hier kennt deine Datenbankstruktur.

    Ich ging davon aus, dass Ob_ID in deinem Fall der Primärschlüssel der Tabelle M_Objekte1 ist. Falls das nicht der Fall sein sollte, musst Du das klarerweise entsprechend anpassen.

    Und natürlich macht man sowas erstmal gegen eine Testdatenbank :) Wo auch sonst?

    Poste doch mal die Struktur der zu aktualisierenden Tabelle als CREATE TABLE Statement (oder ggfs. auch als Screenshot der Entwurfsansicht)

    Führ mal nur dieses Statement aus.

    SELECT *
    FROM   M_Objekte1
           INNER JOIN M_Bestaende ON M_Objekte1.B_ID = M_Bestaende.B_ID
    WHERE  B_intAbk LIKE '%341-04 Adopt%'
    AND    OB_F31 IS NULL

    Kommen dann die richtigen Datensätze für die Tabelle, die Du aktualisieren willst? Falls ja, welche Spalte ist der Primärschlüssel? Ob_ID? Oder B_ID? Oder was ganz anderes? Diese Primärschlüsselspalte gibst Du dann anstelle von * an und kannst dann dieses Statement ausführen (natürlich auch wieder gegen die Testdatenbank)

    UPDATE M_Objekte1
    SET    Ob_F31 = Ob_F30
    WHERE  <Primärschlüsselspalte> IN
           (
            SELECT M_Objekte1.<Primärschlüsselspalte>
            FROM   M_Objekte1
            INNER JOIN M_Bestaende ON M_Objekte1.B_ID = M_Bestaende.B_ID
            WHERE  B_intAbk LIKE '%341-04 Adopt%'
            AND    OB_F31 IS NULL
           )





    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Dienstag, 10. Juli 2018 21:25
    Moderator

Alle Antworten

  • Hi,

    willst Du ein Update der Datensätze durchführen? Oder nur im SELECT Statement den Wert aus Ob_F30 haben, wenn in Ob_F31 nichts drin ist?

    Ersteres würde bspw. so gehen:

    UPDATE <Tabelle>
    SET    Ob_F31 = Ob_F30
    WHERE  Ob_F31 IS NULL
    
    bzw.
    
    UPDATE <Tabelle>
    SET    Ob_F31 = Ob_F30
    WHERE  ISNULL( Ob_F31, '' ) = ''

    Letzteres geht dann bspw. so:

    SELECT ...,
           ISNULL( Ob_F31, Ob_F30 ) AS Ob_F31
    FROM   <Tabelle>


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport


    Dienstag, 10. Juli 2018 12:33
    Moderator
  • Wie immer gibt es viele Möglichkeiten:

    SELECT ...,
           COALESCE( Ob_F31, Ob_F30 ) AS Ob_F31
    UPDATE <Tabelle>
    SET    Ob_F31 = Ob_F30
    WHERE  Ob_F31 IS NULL

    Dienstag, 10. Juli 2018 12:55
  • also ich will bei F31 ein update mit dem Wert aus F30 sofern F31 nichts drin ist, weiterhin ist das Problem dass es sich um eine Bestimmte Grupper handelt, welche in einer Tabelle BEstände definiert ist, also muss ich mit einem Join arbeiten, das folgende funktioniert jedenfalls nicht.

    use DB
    UPDATE M_Objekte1
    SET    Ob_f31 = Ob_F30

    update M_Objekte1
     set Ob_F31 = (select Ob_F30 from M_Objekte1 INNER JOIN M_Bestaende ON M_Objekte1.B_ID = M_Bestaende.B_ID

    where OB_F31 IS NULL 
    AND
     B_intAbk Like '%341%')

    • Bearbeitet Chris4712 Dienstag, 10. Juli 2018 13:02
    Dienstag, 10. Juli 2018 12:56
  • Hi,

    dann geht das so wie in meinem ersten Beispiel, das bfurcheau auch nochmal gepostet hat.

    UPDATE <Tabelle>
    SET    Ob_F31 = Ob_F30
    WHERE  Ob_F31 IS NULL


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Dienstag, 10. Juli 2018 13:02
    Moderator
  • Ja aber wo verarbeite ich die joinklausel, es soll ja nur ein bestimmter Bestand verarbeitet werden, der Bestand hat den Schlüssel B_intABK in der Bestandstabelle, und das ist eine andere Tabelle, das findet er sonst nicht
    Dienstag, 10. Juli 2018 13:09
  • Zum Suchen in der Where-Klausel:

    where exists (select * from Bestand Tabelle.Key = Bestand.B_intABK)

    Dienstag, 10. Juli 2018 13:18
  • Hi,

    da Du mit Ob_ID wahrscheinlich einen eindeutigen (Pimär)Schlüssel hast, bspw. so:

    UPDATE <Tabelle>
    SET    Ob_F31 = Ob_F30
    WHERE  Ob_ID IN (
                     SELECT Ob_ID
                     FROM   M_Objekte1
                            INNER JOIN M_Bestaende ON M_Objekte1.B_ID = M_Bestaende.B_ID
                     WHERE  B_intAbk LIKE '%341-04 Adopt%'
                     AND    OB_F31 IS NULL
                    )


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Dienstag, 10. Juli 2018 15:28
    Moderator
  • Hallo Stefan, danke erstmal, aber dass kann es nicht gewesen sein, habe es zum Glück an einer Testdatenbank ausgeführt. Er sagt mir sind über 45000 Datensätze betroffen. In diesem Bestand mit 341 sind aber nur ein paar 1000. schade
    Dienstag, 10. Juli 2018 16:52
  • Hi,

    nuja, niemand hier kennt deine Datenbankstruktur.

    Ich ging davon aus, dass Ob_ID in deinem Fall der Primärschlüssel der Tabelle M_Objekte1 ist. Falls das nicht der Fall sein sollte, musst Du das klarerweise entsprechend anpassen.

    Und natürlich macht man sowas erstmal gegen eine Testdatenbank :) Wo auch sonst?

    Poste doch mal die Struktur der zu aktualisierenden Tabelle als CREATE TABLE Statement (oder ggfs. auch als Screenshot der Entwurfsansicht)

    Führ mal nur dieses Statement aus.

    SELECT *
    FROM   M_Objekte1
           INNER JOIN M_Bestaende ON M_Objekte1.B_ID = M_Bestaende.B_ID
    WHERE  B_intAbk LIKE '%341-04 Adopt%'
    AND    OB_F31 IS NULL

    Kommen dann die richtigen Datensätze für die Tabelle, die Du aktualisieren willst? Falls ja, welche Spalte ist der Primärschlüssel? Ob_ID? Oder B_ID? Oder was ganz anderes? Diese Primärschlüsselspalte gibst Du dann anstelle von * an und kannst dann dieses Statement ausführen (natürlich auch wieder gegen die Testdatenbank)

    UPDATE M_Objekte1
    SET    Ob_F31 = Ob_F30
    WHERE  <Primärschlüsselspalte> IN
           (
            SELECT M_Objekte1.<Primärschlüsselspalte>
            FROM   M_Objekte1
            INNER JOIN M_Bestaende ON M_Objekte1.B_ID = M_Bestaende.B_ID
            WHERE  B_intAbk LIKE '%341-04 Adopt%'
            AND    OB_F31 IS NULL
           )





    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Dienstag, 10. Juli 2018 21:25
    Moderator
  • Oder probiere mal ein UPDATE ... FROM

    update M
     set Ob_F31 = M.Ob_F30
    from M_Objekte1 M
    INNER JOIN M_Bestaende 
    	ON M_Objekte1.B_ID = M_Bestaende.B_ID
    where OB_F31 IS NULL 
    AND B_intAbk Like '%341%';

    HTH!


    Einen schönen Tag noch, Christoph -- Data Platform MVP - http://www.insidesql.org/blogs/cmu

    Mittwoch, 11. Juli 2018 06:57
  • Alles klar, hat wunderbar geklappt, recht herzlichen Dank noch mal

    Gruss

    chris

    Mittwoch, 11. Juli 2018 12:36