Zum Inhalt springen

Funktionierende Query: UPDATE mit SUBSELECT & IF/ELSE


Schledo

Empfohlene Beiträge

Hallo,

ich hab ein kleines Problemchen. Und zwar verwende ich in einer UPDATE-Query verschiedenen SUBSELECTs um entsprechende Werte zu erhalten. Dies funktionert bisher auch ganz gut. MSSQL SERVER 2000.

Nun ist es leider zwingend notwendig, dass einer dieser SUBSELECTs auch mit einer IF/ELSE-Entscheidung arbeitet und genau hier liegt mein Problem. Wenn ich im Query Analyzer die Query einzeln (quasi nich als Unterabfrage; aber mit dem IF/ELSE) einfüge funktioniert diese, baue ich diese als Unterabfrage ich meine Gesamtabfrage ein, gibt es zwei Fehlermeldungeb die lauten:

Falsche Syntax in der Nähe des IF-Schlüsselwortes.

Zeile 36: Falsche Syntax in der Nähe von ')'. (Anm. das ist nach dem END)

Das geht quasi:

IF( SELECT ... = irgendwas ) IS NULL

BEGIN

SELECT 0 AS ID

END

ELSE

BEGIN

SELECT irgendwas

END

Und das nicht:

UPDATE Tabelle SET

Feld1='04.04.2004',

Feld2=(SELECT ...),

Feld3=(SELECT ...),

Feld4= (IF (SELECT ... = irgendwas) IS NULL

BEGIN

SELECT 0 AS ID

END

ELSE

BEGIN

SELECT irgendwas

END)

WHERE Bedingung

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von Schledo

Falsche Syntax in der Nähe des IF-Schlüsselwortes.

Zeile 36: Falsche Syntax in der Nähe von ')'. (Anm. das ist nach dem END)

Das geht quasi:

IF( SELECT ... = irgendwas ) IS NULL

BEGIN

SELECT 0 AS ID

END

ELSE

BEGIN

SELECT irgendwas

END

Und das nicht:

UPDATE Tabelle SET

Feld1='04.04.2004',

Feld2=(SELECT ...),

Feld3=(SELECT ...),

Feld4= (IF (SELECT ... = irgendwas) IS NULL

BEGIN

SELECT 0 AS ID

END

ELSE

BEGIN

SELECT irgendwas

END)

WHERE Bedingung

Wird so nicht gehen. Innerhalb eines SQL-Statements kannst Du nicht BEGIN und END verwenden. Im obersten Beispiel geht es, weils eine richtige Ablaufsteuerung ist und die Selects für sich stehen und der Query Analyzer dies unterstützt.

Innerhalb einer Stored Procedure wäre das Problem leicht zu lösen. Nun weiß ich aber nicht, wie Du das Update der Tabelle(n) aufrufen willst (innerhalb von Code z.B. VB oder in einem DTS-Paket etc.).

Grüße

Buell

Link zu diesem Kommentar
Auf anderen Seiten teilen

Kannst du das nicht vielleicht auch mit Case-Anweisungen machen? Ich hab schonmal ein ähnliches Problem gehabt. Da musste ich für ein Feld mit einer Kontonummer je nach Art des Kontos eine andere Tabelle joinen, um den Kontonamen anzuzeigen. Ich hab dann beide Tabellen mit einem Left-Join dazugeholt und mit einer Case-Anweisung dann den jeweils nötigen Wert in das Feld geschrieben.

Ansonsten gibt's ja auch noch die Möglichkeit eines UPDATE ... FROM - da gibst du dann einfach dahinter alle Tabellen wie in einem Select-Statement an, aus denen du die Werte brauchst - dann musst du nicht so viele Subselects machen - ein JOIN auf ein SELECT-Statement geht übrigens auch. Und zur größten Not ziehst du dir die ganzen Sachen in eine temporäre Tabelle, läufst dann mit dem IF-ELSE-Block drüber und machst dann das Update mit dieser schon zusammengebastelten Tabelle... - möglich ist also viel... Wenn du zu einem der Vorschläge genauere Infos brauchst, einfach fragen!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Um die SubSelects komme ich wohl nicht herum, da die zu schreibenden (Quell-)Daten bei UPDATE auch erst auch entsrpechenden Feldern/Tabellen/Datenbanken des Server geholt werden müssen und das x-mal.

Funktioniert soweit ja auch alles, nur eben der IF/ELSE - Block in Kombination darin nicht.

Die Quick'n'Dirty Lösung könnte eine Vorherige 2te Abfrage sein, aber das wollte/sollte ich eigentlich vermeiden ... ich kenne ja bei weitem auch nicht alle Klauseln, welche der MSSQL-Server beherrscht, dachte evtl. da gibts was ... :beagolisc

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Wochen später...
Innerhalb einer Stored Procedure wäre das Problem leicht zu lösen. Nun weiß ich aber nicht, wie Du das Update der Tabelle(n) aufrufen willst (innerhalb von Code z.B. VB oder in einem DTS-Paket etc.).

Es müsste innerhalb von Code (in diesem Fall PHP) in nur einer Abbfrage gelöst werden.

Konkret wird das an folgendem Sachverhalt verwendet:

Es sollte zu jedem Task eine Person geben, gibt es aber nicht. Nun sind diese Taks beim Import nicht einfach auszulassen, sondern sollen auch geholt werden. Gleichzeitig soll aber das PersonID-Feld in der Tasktabelle nnicht NULL sein dürfen. Daher war es leider unumgänglich, einen Datensatz in Person einzufügen, mit der ID 0, welcher sich NIEMAND nennt. Das sollte so realisiert werden, das dies nicht im Sinne von Datenbanken ist ist mir klar, hilft mir aber nicht.

Diese Personen werden später händisch/manuell zugeordnet.

Nun soll die Abfrage einfach versuchen eine entsprechende PersonID zu finden und wenn sie das eben nicht findet eine 0 aus dem SubSelect zurückliefern, damit diese in der Tasktabelle als Wert eingetragen werden kann. Und dafür brauch ich doch grundsätzlich die IF/ELSE-Bedinung. Ja/Nein?

Hilfä :(

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...