Komplexe SQL-Abfrage mit Datenbanklink

LLIILLAA

Neuer Benutzer
Beiträge
4
Hallo Forum,

ich würde gerne folgendes in einer Where-Bedingung tun:

....
Where [Tabelle].[Spalte] = [Tabelle]@[Datenbanklink].[Spalte]

Mir gelingt nicht eine Tabellenspalte mit einer anderen Tabellenspalte, über welche auf einen Datenbanklink zugegriffen wird, zu vergleichen.

Gehe ich wie folgt vor:

...
Where [Tabelle].[Spalte] In (Select [Spalte] From [Tabelle]@[Datenbanklink]

erhalte ich folgendes:
Unterabfrage für eine Zeile liefert mehr als eine Zeile

Was mache ich falsch, kann mir jemand helfen?
Vielen Dank im Voraus.
 
Werbung:
Schonmal
Code:
Where [Tabelle].[Spalte] In ( Select [Spalte] From [Schema].[Tabelle]@[Datenbanklink] )
probiert?
 
Hallo Ukulele,

vielen Dank für deine Antwort.

Ich hatte deine Idee schon mal probiert. Aber damit teste ich ja, ob der Wert der Zelle irgendwo in der anderen Spalte vorkommt. Aber ich will eigentlich in meiner Zeile bleiben. Denn innerhalb der Spalte können Mehrfachnennungen vorkommen.

Bin mir jetzt nicht ganz sicher, ob ich mich verständlich ausgedrückt habe????
Aber hoffentlich kann mir jemand helfen. Bin ratlos :-(
 
Eigentlich ist es kein Problem wenn eine Unterabfrage mehrere Werte zurückgibt, sofern das Schlüsselwort davor IN ist. Bei = darf natürlich nur ein Wert zurück gegeben werden.

Ich wollte aber eigentlich auf Schema als Bestandteil des Datenbanklink aus, eine andere Idee habe ich nicht. Klappt die Abfrage mit IN und mehreren Rückgabewerten denn innerhalb der selben DB?
 
Hallo Ukulele,

hm. Danke erstmal für deine Antwort.

Die Abfrage mit IN klappt. Aber das Problem ist folgendes:

- Insgesamt habe ich 561 Datensätze.
- Vergleiche ich diese mit dem Datenbanklink erhalte ich 8 Abweichungen.
- Vergleich wie folgt:
SELECT
[Spalten]
FROM
[Tabelle] ent,
[Tabelle]@[Datenbanklink] produktiv
WHERE
ent.[Spalte1] = produktiv.[Spalte1]
AND(ent.[Spalte2] = 01020 OR ent.[Spalte2] = 01010)
AND(produktiv.[Spalte2] = 01020 OR produktiv.[Spalte2] = 01010)
AND ent.[Spalte3] = 2
AND produktiv.[Spalte3] = 2
AND (ent.koord_x_utm <> produktiv.koord_x_utm
OR ent.koord_y_utm <> produktiv.koord_y_utm
OR ent.koord_x_gk <> produktiv.koord_x_gk
OR ent.koord_y_gk <> produktiv.koord_y_gk
OR ent.koord_x_geo <> produktiv.koord_x_geo
OR ent.koord_y_geo <> produktiv.koord_y_geo)

Abweichungen sind folgende:
x ent y ent x produktiv y produktiv
484250 6059450 484200 6059399
484250 6059450 484200 6059399
484250 6059450 484200 6059399
643550 6035250 529750 5961150
529750 5961150 643550 6035250
483450 6018650 0 0
527050 6029850 0 0
0 0 629550 6003850

Diese 8 Abweichungen will ich eigentlich nicht updaten!
Wenn ich dann aber später im Update-Befehl

Where [Tabelle].[Spalte] In ( Select [Spalte] From [Schema].[Tabelle]@[Datenbanklink] )

eingebe, werden einige Datensätze geupdatet, in denen eigentlich Differenzen sind.

Da die Koordinaten in anderen Datensätzen vorkommen.
Vielleicht doch irdgendeine Idee, wie ich dieses Problem umgehen könnte?
 
Ich denke das man das Problem nicht umgehen muss sondern das irgendwo ein Fehler vorliegt. Wenn ich eine Unterabfrage mache, diese mir mehrere Werte zurück liefert und ich einen meiner Werte in der eigentlichen Abfrage damit vergleiche, dann klappt das. Probleme machen hier höchstens mal NULL Werte etc.

Wenn du in deinem WHERE Teil natürlich explizit die Datensätze abfragst, die du nicht aktuallisieren willst, dann must du NOT IN verwenden. Für mich ergibt leider der ganze Zusammenhang noch keinen Sinn...

PS: Ich nutze MSSQL, ich glaube aber nicht das sich das in diesem Fall so gravierend unterscheidet.
 
Ich denke auch, dass der Unterschied zwischen Mysql und Oracle in diesem Fall nicht gravierend/vorhanden ist.

Nochmal zu meinem Problem.
In meinem Beispiel oben, in welchem ich die Abweichungen der 2 Datenbanken darstelle, ist Datensatz 4 und Datensatz 5 vertauscht.
Deshalb will ich also eigentlich nicht, dass diese Datensätze geupdated werden.
Aber da ich abfrage:

Code:
Where [Tabelle].[Spalte] In ( Select [Spalte] From [Schema].[Tabelle]@[Datenbanklink] )

sehe ich mir alle Datensätze an. Ich will aber innerhalb des einen Datensatzes bleiben.
 
Werbung:
Wie wäre es mit der "EXISTS" - Klause?

Statt:
Where [Tabelle].[Spalte] In ( Select [Spalte] From [Schema].[Tabelle]@[Datenbanklink] )
Dies:
Where EXISTS ( Select 1 From [Schema].[Tabelle]@[Datenbanklink] b where b.[Spalte] = [Tabelle].[Spalte]
)

Lg
 
Zurück
Oben