SQL-Query, Guids und ein klassischer Hä?-Effekt

26/08/2009 - 09:18 von Julia M | Report spam
Hallo,

Ich habe eine Access-DB (mdb), 2 Tabellen mit Guids (also
Replikations-IDs) und erlebe bei einer doch recht simplen Abfrage
eigenartige Anwandlungen des Systems.

Tabelle1 und 2 bestehen jeweils nur aus 2 Spalten und zwar GuidA und
GuidB - eine Art Objektzuordnung.
Ich möchte nun nichts weiter tun als herauszufinden, ob ein Objekt A
sowohl in der einen als auch anderen Tabelle mit ganz bestimmten
Objekten B verknüpft ist.

SELECT T1.GuidA, T2.GuidA
FROM T1,T2
WHERE T1.GuidB='{eineguid}' AND T2.GuidB='{eineandereguid}'

Lasse ich diese Query laufen, so erhalte ich definitiv ein Ergebnis,
in dem die beiden GuidAs aus T1 und T2 identisch sind.

Dies bestàtigt auch eine leicht abgewandelte Query

SELECT T1.GuidA=T2.GuidA
FROM T1,T2
WHERE T1.GuidB='{eineguid}' AND T2.GuidB='{eineandereguid}'

Das Ergebnis ist "-1", was ich als True interpretiere

Hànge ich dies jedoch als zusàtzliche Bedingung an ...

SELECT T1.GuidA,T2.GuidA
FROM T1,T2
WHERE T1.GuidB='{eineguid}' AND T2.GuidB='{eineandereguid}'
AND T1.GuidA=T2.GuidA

... so ist das Ergebnis ... LEER??


Wenn ich exakt dieselbe Abfrage über testweise angelegte Tabellen
laufen lasse, die alle Eintràge als reinen Text enthàlt, so erhalte
ich auch mit der letzten Query immer ein Ergebnis.

Hat jemand eine Idee, was da vorgeht? :-/

Danke
 

Lesen sie die antworten

#1 Peter Fleischer
26/08/2009 - 11:17 | Warnen spam
"Julia M" schrieb im Newsbeitrag
news:

Hat jemand eine Idee, was da vorgeht? :-/



Je nach Datenlage ist das Ergebnis korrekt und kann mit der folgenden Demo
reproduziert werden:

Option Explicit On
Option Infer On
Option Strict On

Imports System.Data.OleDb

Module Module1

Sub Main()
' Testdaten bilden
Console.WriteLine(" Testdaten bilden")
Dim gArr(10) As Guid
For i = 0 To gArr.GetUpperBound(0)
gArr(i) = Guid.NewGuid
Next
'
Try
' Verbindung aufbauen
Console.WriteLine(" Verbindung aufbauen")
Using cn As New OleDbConnection(My.Settings.cnmdb)
cn.Open()
Using cmd As New OleDbCommand("", cn)
With cmd
' alte Tabellen löschen
Console.WriteLine(" alte Tabellen löschen")
Try
.CommandText = "DROP TABLE xTab1"
Console.WriteLine(" DROP xTab1, ret code: {0}",
.ExecuteNonQuery)
Catch ex As Exception
Console.WriteLine(" DROP xTab1, Error: {0}", ex.Message)
End Try
Try
.CommandText = "DROP TABLE xTab2"
Console.WriteLine(" DROP xTab2, ret code: {0}",
.ExecuteNonQuery)
Catch ex As Exception
Console.WriteLine(" DROP xTab2, Error: {0}", ex.Message)
End Try
' neue Tabellen anlegen
Console.WriteLine(" neue Tabellen anlegen")
.CommandText = "CREATE TABLE xTab1(a uniqueidentifier, b
uniqueidentifier)"
Console.WriteLine(" Create xTab1, ret code: {0}",
.ExecuteNonQuery)
.CommandText = "CREATE TABLE xTab2(a uniqueidentifier, b
uniqueidentifier)"
Console.WriteLine(" Create xTab2, ret code: {0}",
.ExecuteNonQuery)
' neue Tabellen füllen
Console.WriteLine(" xTab1 füllen")
.CommandText = "INSERT INTO xTab1(a,b) VALUES(?,?)"
.Parameters.Clear()
.Parameters.Add("@p1", OleDbType.Guid)
.Parameters.Add("@p2", OleDbType.Guid)
For i = 0 To gArr.GetUpperBound(0) - 2
.Parameters(0).Value = gArr(i)
.Parameters(1).Value = gArr(i + 1)
.ExecuteNonQuery()
Next
Console.WriteLine(" xTab2 füllen")
.CommandText = "INSERT INTO xTab2(a,b) VALUES(?,?)"
.Parameters.Clear()
.Parameters.Add("@p1", OleDbType.Guid)
.Parameters.Add("@p2", OleDbType.Guid)
For i = 0 To gArr.GetUpperBound(0) - 2
.Parameters(0).Value = gArr(i)
.Parameters(1).Value = gArr(i + 2)
.ExecuteNonQuery()
Next
' Abfrage "jeder mit jedem"
Console.WriteLine(" Abfrage 'jeder mit jedem'")
.CommandText = "SELECT count(*) FROM xTab1 T1, xTab2 T2 WHERE
T1.b=? AND T2.b=?"
.Parameters.Clear()
.Parameters.Add("@p1", OleDbType.Guid).Value = gArr(3)
.Parameters.Add("@p2", OleDbType.Guid).Value = gArr(5)
Console.WriteLine(" SELECT Count, ret code: {0}",
.ExecuteScalar)
' Abfrage "verknüpft"
Console.WriteLine(" Abfrage 'verknüpft'")
.CommandText = "SELECT count(*) FROM xTab1 T1, xTab2 T2 WHERE
T1.b=? AND T2.b=? and T1.a=T2.a"
.Parameters.Clear()
.Parameters.Add("@p1", OleDbType.Guid).Value = gArr(3)
.Parameters.Add("@p2", OleDbType.Guid).Value = gArr(5)
Console.WriteLine(" SELECT Count, ret code: {0}",
.ExecuteScalar)
End With
End Using
End Using
Console.WriteLine(" Test beendet")
Catch ex As Exception
Console.WriteLine(ex.ToString)
End Try
Console.ReadLine()
End Sub

End Module

Du erhöhst Deine Chance, dass Deine Frage überhaupt gelesen und qualifiziert
und schnell beantwortet wird, wenn Du Deinen Realnamen im Absender
einstellst (Vor- und Zuname).

Viele Grüsse
Peter

Ähnliche fragen