Sollte ich Oben(1) in einer Unterabfrage
Beispiel-Query:
select *
from A join B on A.ID = B.SOMEVALUE
where A.VALUE="something" and
B.ID =
(select ID from B where SOMEVALUE = A.ID and
THISDATE = (select max(SOMEDATE) from B where ...))
so, wenn man Lesen kann SQL sollten Sie sehen, dass ich Tue, ein paar korrelierte Unterabfragen, um die Ergebnisse einzugrenzen, die mitmachen . (und ja, das ist furchtbar stark vereinfacht).
In bestimmten Fällen die Unterabfrage:
select ID from B where SOMEVALUE = A.ID and
THISDATE = (select max(SOMEDATE) from B where ...)
kann wieder mehr als 1 Wert, der einen Fehler verursacht
"Unterabfrage hat mehr als 1 Wert.
Dies ist nicht zulässig, wenn die
Unterabfrage folgt =, !=, <, <= , >, >=
oder wenn die Unterabfrage verwendet wird, wie eine
Ausdruck."
die ich voll erwarten. Dies ist offensichtlich nicht eine gute Sache, und ich habe den code in Ort, um (hoffentlich) zu verhindern, dass diese Duplikate in der Datenbank an Erster Stelle (ie der Tabelle B sollte nur 1 Zeile entspricht der
SOMEVALUE = A.ID and max(SOMEDATE)
Kriterien), jedoch sind die Endbenutzer nichts, wenn nicht kreative Wege finden, wie ich kann nicht glauben, brechen software.
So, jetzt zu meiner Frage:
Wäre es besser, ändern Sie die erste Unterabfrage, um
select top 1 * from B ...
zu verhindern, dass die Benutzer sehen eine Fehlermeldung, wenn/wenn (hoffentlich nie) diese situation entsteht, oder lassen Sie den Fehler durch zu kommen. Ich bin Neigung zu nicht hinzufügen die top-Anweisung, und lassen Sie den Fehler durch gekommen, eher dann lassen die Benutzer sehen möglicherweise falsche Daten. Ich Frage mich, ob jemand irgendwelche Gedanken über die Besten Praktiken in einer situation wie dieser...
InformationsquelleAutor pfunk | 2009-01-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Normalerweise TOP 1 ist eine gute Idee.
Prüfen, eine große Tabelle mit Millionen von Zeilen mit keinen index auf die Spalte, die Sie passend sind, jedoch sind Sie nur auf der Suche nach einer einzelnen Zeile.
SELECT TOP 1 bedeutet, dass das table-scan wird beendet, sobald die eine Position gefunden wird.
Ohne die TOP 1, das Scannen der Tabelle weiter bis zum Ende.
Als mit irgendetwas, das mit dem Scannen (oder brute-force) zu tun, der Suche. Mit TOP 1, es sollte im Durchschnitt 50% schneller als nicht mit TOP 1.
Jedoch, Je nachdem, was Sie brauchen, um wieder zurück, Ein echter performance-Gewinn kann in der Regel durch die Verwendung EXISTIERT.
Statt zu schreiben
Können Sie
InformationsquelleAutor John
Warum sind Sie beitreten Tabelle A und B... dann die Auswahl von B in die sub-Abfrage... und im Vergleich zu einer Spalte in einer???
Wäre das nicht äquivalent:
Auch, wenn Sie erwarten, zu bekommen, eine Zeile insgesamt von dieser ganzen Abfragen... würde dies nicht funktionieren:
Warum gehst du nicht zeigen Sie mir das echte Abfrage?
die zweite Abfrage würde nicht funktionieren, weil von der äußeren-die meisten-Abfrage, die ich tun möchte, mehr als eine Zeile. Aber nachdem Sie es köcheln lassen, für ein bisschen ich glaube, ich kann die Waffe sprang und die erste Abfrage arbeiten könnte. Der einzige Unterschied ist, dass ich mehrere Zeilen, in denen mit meiner Abfrage, ich würde einen Fehler erzeugen
Auf beide Beispiele Sie könnten auch die "A. VALUE='etwas'" im Rahmen der AUF den Eintritt der Bedingung, Sie sparen würde einige Millisekunden hier kann durch filtern der Anfang, anstatt die Verknüpfung der ersten, dann filtern
InformationsquelleAutor bobwienholt
Codierung der Praxis: top1-Platzierung in einer Unterabfrage, die erforderlich ist, um einen einzigen Wert zurückzugeben.
Vorteile:
Nachteile:
InformationsquelleAutor Amy B
Ich würde empfehlen, die TOP-1-Ansatz. Es wird wahrscheinlich helfen, die Leistung (wahrscheinlich nicht weh getan).
Die Vorstellung, dass es ohne Sie fangen Fehler ist ehrenwert, aber ein wenig fehl am Platz. Wenn ein Fehler Auftritt, hier Monate ab jetzt, wird es NICHT intuitiv überhaupt, warum es geschah oder was Los ist. Stattdessen würde ich den Fokus auf die Durchsetzung der Datenintegrität anderswo.
InformationsquelleAutor Michael Haren
Warum nicht
LIMIT 1
am Ende deiner sub-select?Vereinbart mit Michael, es ist ein anderes Geschmack also LIMIT 1 würde wohl tatsächlich in dieser syntax.
Beantwortet nicht die Frage, aber es muss geklärt werden, was die Frage war, was für diejenigen von uns, die nicht mit dem TOP-1-syntax.
InformationsquelleAutor inkedmn
Wenn Sie schauen, um zurück nur einer einzigen Zeile, die Sie könnte eines von zwei Dingen tun. Die erste ist die änderung der gleichheitsüberprüfung stattdessen überprüfen containment wie so
(Beachten Sie die)
Zweitens könnten Sie tun,
wenn Sie nur auf der Suche nach einem Wert.
Oder, wie Sie sagte, Sie könnte sich ändern, die sub-Abfrage SELECT TOP 1 das ist okay, meiner Meinung nach, denn so lange wie die WHERE-Klausel ist nicht abhängig von der äußeren Abfrage, es wird wahrscheinlich führen Sie die verschachtelte Abfrage nur einmal und verlassen Sie sich auf eine statisch gespeicherten Wert an wie so
Also es gibt ein paar Optionen, aber ich bin mir nicht ganz sicher auf Ihre Effizienz.
InformationsquelleAutor Kezzer