SQL Query Theorie Frage - Single-Statement vs Multi-Statement-Abfragen
-
19-09-2019 - |
Frage
Wenn ich SQL-Abfragen zu schreiben, finde ich mich oft denkt, dass „es gibt keine Möglichkeit, dies mit einer einzigen Abfrage zu tun“. Wenn das passiert ich gespeicherte Prozeduren oft drehen oder mehrere Anweisungen Tabellenwertfunktionen, die temporären Tabellen verwenden (von einer oder anderen Art) und einfach die Ergebnisse am Ende kombiniert und die Ergebnistabelle zurück.
Ich frage mich, ob jemand weiß, einfach als eine Frage der Theorie, sei es sollte möglich sein, jede Abfrage zu schreiben, die ein einzelnes Ergebnis als eine einzelne Abfrage (nicht mehr Anweisungen) gesetzt zurückzugibt. Offensichtlich ich ignoriere relevante Punkte wie Code-Lesbarkeit und Wartbarkeit, vielleicht sogar die Abfrageleistung / Effizienz. Dies ist mehr über Theorie - es kann getan werden ... und keine Sorge, ich plane sicher nicht zwingen, mich zu beginnen, eine Single-Anweisung Abfrage zu schreiben, wenn Multi-Statement besser wird mein Ziel in allen Fällen gerecht, aber es könnte mich auf zweimal oder ein bisschen mehr denken, ob es ein gangbarer Weg ist das Ergebnis von einer einzigen Abfrage zu erhalten.
Ich denke, ein paar Parameter in Ordnung ist - ich bin eine relationale Datenbank zu denken (wie MS SQL) mit Tabellen, die gemeinsame Best Practices (wie alle Tabellen einen Primärschlüssel mit und so weiter) folgen
Hinweis: (. Bezugnahme auf Bahnmaterial oder etwas ähnliches), um ‚akzeptierte Antwort‘ auf diese zu gewinnen, werden Sie einen endgültigen Beweis zur Verfügung stellen müssen
Lösung
Zumindest bei der eine aktuelle Version von Oracle ist absolut möglich. Es hat eine ‚Modell-Klausel‘, die SQL-Turing komplett macht. (
Andere Tipps
Ich glaube, es ist möglich. Ich habe mit sehr schwierigen Anfragen gearbeitet, sehr langen Abfragen und oft ist es möglich, es mit einer einzigen Abfrage zu tun. Aber die meiste Zeit ist es schwieriger zu mantain, also wenn Sie es mit einer einzigen Abfrage zu tun, stellen Sie sicher, dass Sie Ihre Anfrage Kommentar sorgfältig.
Ich habe noch nie etwas begegnet, die nicht in einer einzigen Abfrage getan werden könnte.
Aber manchmal ist es am besten, es in mehr als eine Abfrage zu tun.
Ich kann es nicht beweisen, aber ich glaube, die Antwort ein vorsichtiges ja ist - vorausgesetzt, Ihr Datenbank-Design richtig gemacht wird. In der Regel gezwungen, mehr Erklärungen zu schreiben, um ein bestimmtes Ergebnis zu bekommen, ist ein Zeichen dafür, dass Ihr Schema einige Verbesserungen benötigen.
Ich würde „Ja“ sagen, aber es nicht beweisen kann. Aber mein Hauptdenkprozess:
-
Alle wählen soll eine Reihe basierend Betrieb sein
-
Ihre Annahme ist, dass Sie mit mathematisch korrekten Sätzen handeln (dh normierte richtig)
-
Setzen der Theorie sollte es möglich garantieren
Andere Gedanken:
-
Mehrere SELECT-Anweisung lädt oft temporäre Tabellen / Tabellenvariablen. Diese können in CTEs abgeleitet oder getrennt werden.
-
Jede RBAR Verarbeitung (gut oder schlecht) jetzt mit CROSS / OUTER APPLY auf abgeleitete Tabellen
behandelt werden
-
UDF würde als „Betrug“ in diesem Zusammenhang Ich fühle mich eingestuft werden, weil es Ihnen eine SELECT in ein anderes Modul setzen kann, anstatt in Ihrem einzelnen
-
Nein in Ihrem "vor" Folge von DML erlaubt schreibt: dieser Zustand von SELECT ändert SELECT
-
Haben Sie einen Teil des Codes in unserem Shop?
gesehen
Bearbeiten, Glossar
- RBAR = Row durch Agonizing Row
- CTE = Common Table Expression
- UDF = User Defined Function
Edit: GILT: Betrug
SELECT
*
FROM
MyTable1 t1
CROSS APPLY
(
SELECT * FROM MyTable2 t2
WHERE t1.something = t2.something
) t2
In der Theorie ja, wenn Sie verwenden Funktionen oder eine quälende Labyrinth von OUTER applys oder Unterabfragen; jedoch aus Gründen der Lesbarkeit und Leistung haben wir immer am Ende mit temporären Tabellen gehen und mit mehreren Anweisungen gespeicherte Prozeduren.
Als jemand oben ausgeführt, ist dies in der Regel ein Zeichen dafür, dass Ihre Datenstruktur zu riechen beginnt; nicht, dass es schlecht , aber das ist es vielleicht Zeit für Performance-Gründen denormalise (passiert den Besten von uns), oder vielleicht eine denormalised abfragenden Schicht vor dem normalisierten „echten“ Daten setzen.