Verschiedene Ergebnisse bie SQL Abfragen
Daniel_83
- datenbank
0 Lulli0 Autos klauen
werbeklaus0 Ilja0 Daniel_830 Frank (no reg)0 Ilja0 Frank (no reg)0 Ilja
0
MudGuard
Hi zusammen,
ich habe folgendses Problem:
ich habe eine Abfrage geschrieben, die mir eine Liste an Autos gibt, die keine Händler mehr haben. Diese Funktioniert auch soweit, jedoch habe ich mit dem Ergebnis so meine Probleme.
Die Abfrage lautet wie folgt:
-----------------------------------------------------------
SELECT lCarID, lDealerID
FROM tblCars
WHERE (lDealerID is not NULL)AND(lDealerID NOT IN (SELECT lDealerID FROM tblDealers))AND(bConfirmed='0')
ORDER BY lDealerID
-----------------------------------------------------------
Gebe ich diese Abfrage in den Query Analyzer ein, bekomme ich 2401 Ergebnisreihen. Packe ich diese Abfrage in eine 'gespeicherte Prozedur' und rufe das ganze dann aus einem ASP Script aus auf, bekomme ich über 15.000 Ergebnisreihen.
Hier kurz das ASP-Script:
----------------------------------------------------------
<%@ Language=VBScript %>
<% OPTION EXPLICIT
FUNCTION FncGetDeadCars (ConnObj)
DIM rsTemp
SET rsTemp = server.CreateObject ("ADODB.recordset")
rsTemp.Open "EXEC proc_GetDeadCars", ConnObj
SET FncGetDeadCars = rsTemp
END FUNCTION
Server.ScriptTimeout = 800
DIM myConn, rsCars, myCarID, myConfirmed, myDeleted, tmpStr, i
SET myConn = Server.CreateObject("ADODB.Connection")
i=1
myConn.ConnectionString = "DSN=*****; UID=*****; pwd=*****"
myConn.Open
SET rsCars = FncGetDeadCars (myConn)
Response.Write "CarID -- DealerID"
Response.Write "<br>"
IF NOT rsCars.EOF THEN
DO
Response.Write rsCars("lCarID") &" -- "& rsCars("lDealerID")
Response.Write "<br>"
rsCars.moveNext
LOOP UNTIL rsCars.EOF
ELSE
Response.Write ("Keinen Datensatz gefunden<br>")
END IF
myConn.Close
%>
-----------------------------------------------
Und hier die Prozedur:
-----------------------------------------------
CREATE PROCEDURE proc_GetDeadCars AS
SELECT lCarID, lDealerID
FROM tblCars
WHERE (lDealerID is not NULL)AND(lDealerID NOT IN (SELECT lDealerID FROM tblDealers))AND(bConfirmed='0')
ORDER BY lDealerID
GO
-----------------------------------------------
Hat einer von Euch eine Idee, warum ich so extrem unterschiedliche Ergebnisse bekomme? Es handelt sich beides mal um die gleiche Abfrage.
Ich weiß nicht weiter.
Danke schonmal!!
Hi,
Hat einer von Euch eine Idee, warum ich so extrem unterschiedliche Ergebnisse bekomme? Es handelt sich beides mal um die gleiche Abfrage.
moegliche Ursachen u.a.:
Was passiert den, wenn Du die SP im Datenbankabfragetool ausfuehrst? Wieviele Datensaetze gibts dann zurueck?
Gruesse!
Lulli
Was passiert den, wenn Du die SP im Datenbankabfragetool ausfuehrst? Wieviele Datensaetze gibts dann zurueck?
Genau das gleiche.. Ich bekomme wieder 2401 Datensätze. Die Einstellungen für den Analyzer habe ich auch schon durchgesehen, es gibt keine Begrenzung für die Anzahl der Ergebnisdatensätze.
Wenn ich das über das Script laufen lasse, kommen auch keine doppelten Einträge. Also er läuft wirklich nur ein mal über die Tabelle.
Hi,
Genau das gleiche.. Ich bekomme wieder 2401 Datensätze. Die Einstellungen für den Analyzer habe ich auch schon durchgesehen, es gibt keine Begrenzung für die Anzahl der Ergebnisdatensätze.
was ist denn richtig, das was der QA zurueckgibt oder das was ASP beim Datenzugriff erhaelt und ausgibt?
So kannst Du die Fehlerquelle zumindest ein wenig besser isolieren.
Gruesse!
Lulli
Hallo,
ich habe eine Abfrage geschrieben, die mir eine Liste an Autos gibt, die keine Händler mehr haben.
So einfach bekommt man heute Autos?
Die Abfrage versuch ich auch mal!
werbeklaus
yo,,
ich würde eine andere abfrage nehmen.
SELECT lCarID, lDealerID
FROM tblCars
LEFT JOIN tblDealers
ON (tblCars.lDealerID = tblDealers.lDealerID AND tblDealers.bConfirmed='0')
WHERE tblDealers.lDealerID IS NULL
ORDER BY tblCars.lDealerID
ob nun die spaltennamen übereinstimmen, mmusst du noch einmal überprüfen. aber ein LEFT JOIn wäre hier angebrachter.
Ilja
yo,,
ich würde eine andere abfrage nehmen.
SELECT lCarID, lDealerID
FROM tblCars
LEFT JOIN tblDealers
ON (tblCars.lDealerID = tblDealers.lDealerID AND tblDealers.bConfirmed='0')
WHERE tblDealers.lDealerID IS NULL
ORDER BY tblCars.lDealerIDob nun die spaltennamen übereinstimmen, mmusst du noch einmal überprüfen. aber ein LEFT JOIn wäre hier angebrachter.
Ilja
Danke, nur leider wird diese Abfrage bei meinem Problem nicht weiter helfen.
Deine Abfrage guckt, ob die DealerID des Autos gleich ist mit der der Dealer. Das Problem ist, das ich Autoleichen in der Datenbank habe. Also Autos, zu denen die Händler schon gelöscht wurden. Ein Auto kann noch eine DealerID besitzen, obwohl der Dealer in der tblDealers nicht mehr existiert. Eine 'lDealerID is NULL' Abfrage würde nichts bringen.
Trotzdem Danke !!!
Das konntest du aber auch nicht wissen. Sorry. Da fehlter bei mir der Informationsfluss.. =:0)
yo,
Deine Abfrage guckt, ob die DealerID des Autos gleich ist mit der der Dealer. Das Problem ist, das ich Autoleichen in der Datenbank habe. Also Autos, zu denen die Händler schon gelöscht wurden.
du hast aber schon geshen, dass es sich hier um einen OUTER JOIN handelt ganuer gesagt einen LEFT OUTER JOIN, die unter anderem für genau solche zwecke entwickelt wurden, wie du sie haben willst ?
wenn du n icht weißt, wie ein OUTER JOIN funktioniert, frage einfach, viele kluge köpfe hier werden dir antworten.
Ilja
Hi Ilja,
wenn du die Möglichkeit hättest, dann solltest du dir vielleicht einfach die Ausführungspläne beider Abfragen anschauen. Ein Join muss nicht immer besser sein :) Ich erinnere mich gerade, dass es solch ein Thema schon mal vor ein oder zwei Monden hier gegeben hat. Nur weil's Join(t)s gibt muss man die noch lange nicht verwenden bzw. rauchen ;)
An den OP:
Für dich gilt das gleiche, schau dir die Ausführungspläne an, in dem du beide Varianten im SQLQA laufen lässt. Das Plan sollte eigentlich identisch sein.
Des weiteren lass nebenbei den Profiler mitlaufen (der gehört zu den SQL Client Tools dazu), RPC:Completed, SP:Completed, SP:StmtCompleted als Events mittracen. Lass dann abwechselnd (1x im Query Analyzer, 1x von ASP aus) beide Abfragevarianten (SELECT / EXEC SP...) durchlaufen und schau dir an, was der Profiler mitgenommen hat.
Wenn das auf der selben Verbindung (selber server und db) jeweils die gleichen Ergebnisse bringt, dann könnte evt. deine Verbindung verbogen sein und du selektierst 15k Ergebnisse von einer völlig anderen Quelle. Deine Situation erscheint mir im allgemeinen etwas ominös.
Und noch einen Tip, musst du denn unbedingt einen DSN Verbindungsnamen verwenden, welcher Provider/Treiber steckt dahinter? Wenn noch ODBC, dann solltest du dies auf OLEDB ändern, der Provider dafür heißt SQLOLEDB.1 ... Google mal danach und nach "UDL" Universal Data Link. Damit kannst du dir im Handumdrehen einen passenden ConnectionString basteln.
Ich hoffe ich konnnte etwas helfen,
Ciao, Frank
yo,
wenn du die Möglichkeit hättest, dann solltest du dir vielleicht einfach die Ausführungspläne beider Abfragen anschauen. Ein Join muss nicht immer besser sein :)
ein join ist auch nicht immer besser. aber du bist einen schritt zuweit. es geht erst einmal darum, das richtige ergebnis zu bekommen und dann eine auswahl zu treffen.
Ilja
Hi,
warum zu weit? Offensichtlich bekommt der OP unterschiedliche
Ergebnisse obwohl eigentlich dieselbe Abfrage durchgeführt wird.
Deshalb wäre es der Klärung förderlich, wenn er hinsichtlich der
Ausführung Vergleichbarkeiten sammelt (Ausführungsplan, Profiler)
und diese dann untersucht.
Gruß, Frank
yo,
warum zu weit? Offensichtlich bekommt der OP unterschiedliche
Ergebnisse obwohl eigentlich dieselbe Abfrage durchgeführt wird.
weil du das thema "besser" (geschwindigkeit ?) angesprochen hast. hier get es aber erst einmal darum, aus zwei ergebnissen eins zu machen. wenn man den nun zwei abfragen hat, die das gleiche ergebnis anzeigen, dann kann mich sich über tuning gedanken machen. aber wenn man noch gar keine gewünschte ergebnismenge hat, bzw. zwei unterschiedliche....
deswegen mein tipp, es mal mit einem outer join zu versuchen, um zu sehen, ob auch dabei zwei unterschiedliche ergebnismengen herauskommen.
Ilja
Hi,
schau an, da haben wir irgendwie etwas aneinander vorbeigeredet. Macht
aber nix, ich kann deinen Standpunkt auch nachvollziehen, wobei ich
erst gedacht hatte, dass du auf das Thema Performance anspielst hin-
sichtlich der Verwendung eines Joins.
Ciao, viele Grüße vom Zürisee
Frank
Hi,
SELECT lCarID, lDealerID
ersetze das doch mal durch
SELECT COUNT(*)
um sicher auszuschließen, daß es nicht an irgendeiner Mengenbegrenzung des Query Analyzer liegt ...
cu,
Andreas