Wir alle wissen, dass wir alle Spalten aus einer Tabelle auswählen können
SELECT * FROM tableA
Gibt es eine Möglichkeit, Spalten aus einer Tabelle auszuschließen, ohne alle Spalten anzugeben?
SELECT * [except columnA] FROM tableA
Die einzige Möglichkeit, die ich kenne, besteht darin, alle Spalten manuell anzugeben und die unerwünschte Spalte auszuschließen. Dies ist sehr zeitaufwändig, daher suche ich nach Möglichkeiten, um Zeit und Mühe zu sparen, sowie nach zukünftigen Wartungsarbeiten, falls die Tabelle mehr / weniger Spalten enthält.
sql
sql-server
tsql
pb2q
quelle
quelle
SELECT *
Abfrage verwenden (OLE DB hat Probleme beim Zuordnen dieser Spalten ). Ich konnte nicht die richtigen Spalten angeben, da ich keinen direkten Zugriff auf die MySQL-Datenbank hatte. SQL Server war jedoch so freundlich, mich über die Namen der char-Spalten mit fester Breite zu informieren ...SELECT DISTINCT *
außer dass die Schlüsselspalte ohne doppelte Zeilen funktioniert, die jemand anderes erstellt hatAntworten:
Ich stimme allen zu ... aber wenn ich so etwas machen würde, könnte ich es so machen:
quelle
SELECT table1.ID AS table1ID ...
IIRC.Nein.
Die bewährte Methode für Wartungslicht besteht darin, nur die erforderlichen Spalten anzugeben.
Mindestens 2 Gründe:
Bearbeiten (Juli 2011):
Wenn Sie den
Columns
Knoten für eine Tabelle aus dem Objekt-Explorer ziehen , wird eine CSV-Liste mit Spalten im Abfragefenster für Sie eingefügt, mit der eines Ihrer Ziele erreicht wirdquelle
Wenn Sie nicht jeden Spaltennamen manuell schreiben möchten, können Sie ihn verwenden,
Script Table As
indem Sie mit der rechten Maustaste auf eine Tabelle oder Ansicht in SSMS klicken :Anschließend erhalten Sie im Fenster "Neuer Abfrage-Editor" eine vollständige Auswahlabfrage. Entfernen Sie dann unerwünschte Spalten wie folgt :
Erledigt
quelle
Der automatisierte Weg, dies in SQL (SQL Server) zu tun, ist:
quelle
row_number()
an jede Zeile angehängt wird , dann einen Join von ausführenrow_number
und dann alles außerrow_number
dem Ergebnis des Joins auswählen .Sie können eine Ansicht mit den Spalten erstellen, die Sie auswählen möchten, und dann einfach
select *
aus der Ansicht ...quelle
Ja, es ist möglich (aber nicht empfohlen).
Erläuterung des Codes :
SELECT @variable = @variable + ... FROM
diese Option, um die Spaltennamen zu verketten. Diese Art vonSELECT
gibt keine Ergebnismenge zurück. Dies ist möglicherweise ein undokumentiertes Verhalten, funktioniert jedoch in jeder Version von SQL Server. Alternativ können SieSET @variable = (SELECT ... FOR XML PATH(''))
Zeichenfolgen verketten.ISNULL
Funktion, um ein Komma nur voranzustellen, wenn dies nicht der erste Spaltenname ist. Verwenden Sie dieQUOTENAME
Funktion, um Leerzeichen und Interpunktion in Spaltennamen zu unterstützen.WHERE
Klausel, um Spalten auszublenden, die wir nicht sehen möchten.EXEC (@variable)
, auch als dynamisches SQL bezeichnet , um die Spaltennamen zur Laufzeit aufzulösen. Dies ist erforderlich, da wir die Spaltennamen zur Kompilierungszeit nicht kennen.quelle
SELECT @columns FROM contact
Wie die anderen gesagt haben, gibt es keine Möglichkeit, dies zu tun, aber wenn Sie SQL Server verwenden, besteht ein Trick, den ich verwende, darin, die Ausgabe in durch Kommas getrennte zu ändern
und schneiden Sie die gesamte Liste der Spalten aus dem Ausgabefenster. Dann können Sie auswählen, welche Spalten Sie möchten, ohne sie alle eingeben zu müssen.
quelle
Grundsätzlich können Sie nicht tun, was Sie möchten - aber Sie können die richtigen Tools erhalten, die Ihnen dabei helfen, die Dinge ein bisschen einfacher zu machen.
Wenn Sie sich die SQL-Eingabeaufforderung von Red-Gate ansehen , können Sie "SELECT * FROM MyTable" eingeben, den Cursor nach "*" zurückbewegen und <TAB> drücken, um die Liste der Felder zu erweitern und die wenigen Felder zu entfernen, die Sie haben brauche nicht.
Es ist keine perfekte Lösung - aber eine verdammt gute! :-) Schade, dass Intellisense von MS SQL Server Management Studio immer noch nicht intelligent genug ist, um diese Funktion anzubieten .......
Marc
quelle
Nein, dazu gibt es keine Möglichkeit. Vielleicht können Sie benutzerdefinierte Ansichten erstellen, wenn dies in Ihrer Situation möglich ist
EDIT Kann sein , wenn Ihre DB Ausführung von dynamischen unterstützt SQL u einen SP schreiben könnte und übergeben Sie die Spalten u will nicht , es zu sehen und lassen Sie es die Abfrage dynamisch erzeugen und liefert das Ergebnis für Sie. Ich denke, dass dies zumindest in SQL Server möglich ist
quelle
Wenn Sie SQL Server Management Studio verwenden, gehen Sie wie folgt vor:
Genießen.
quelle
In SQL Management Studio können Sie die Spalten im Objekt-Explorer erweitern und dann das
Columns
Baumelement in ein Abfragefenster ziehen, um eine durch Kommas getrennte Liste von Spalten zu erhalten.quelle
Zusammenfassend können Sie dies nicht tun, aber ich bin mit allen obigen Kommentaren nicht einverstanden. Es gibt "Szenarien", in denen Sie ein * legitim verwenden können, wenn Sie eine verschachtelte Abfrage erstellen, um einen bestimmten Bereich aus einer ganzen Liste auszuwählen (z Paging) Warum in aller Welt möchten Sie jede Spalte in der äußeren select-Anweisung angeben, wenn Sie dies in der inneren getan haben?
quelle
AKTUALISIEREN:
Sie können auch eine gespeicherte Prozedur erstellen, um diese Aufgabe zu erledigen, wenn Sie sie häufiger verwenden. In diesem Beispiel habe ich das integrierte STRING_SPLIT () verwendet, das unter SQL Server 2016+ verfügbar ist. Bei Bedarf gibt es jedoch zahlreiche Beispiele für die manuelle Erstellung in SO.
Und dann einfach:
quelle
Wenn es sich um Prozeduren handelt, funktioniert es mit diesem Trick, eine neue Abfrage zu generieren und sie SOFORT AUSZUFÜHREN :
quelle
Verwenden von deklarativem SQL auf die übliche Weise, nein.
Ich denke, Ihre vorgeschlagene Syntax ist würdig und gut. Tatsächlich hat die relationale Datenbanksprache 'Tutorial D' eine sehr ähnliche Syntax, bei der auf die Schlüsselwörter
ALL BUT
eine Reihe von Attributen (Spalten) folgt.Allerdings
SELECT *
bekommt SQL bereits viel Flak (@ Guffas Antwort hier ist ein typischer Einwand), daher denke ich nicht, dassSELECT ALL BUT
es bald in den SQL-Standard kommen wird.Ich denke, die beste "Umgehung" besteht darin, eine
VIEW
mit nur den Spalten zu erstellen, die Sie dann wünschenSELECT * FROM ThatView
.quelle
select *
fragwürdig halten - sehr nützlich für Ad-hoc-Inhalte und Programme, die generisch mit Datentabellen umgehen müssen, aber nicht so sehr für die Erstellung (mangels eines besseren Wortes). "reine" Abfragen. Nicht im ANSI-Standard zu sein bedeutet nicht, dass Microsoft ihn nicht wie bei vielen anderen Dingen zu seinem Dialekt hinzufügen kann, aber ich bin skeptisch, ob dies der Fall ist.Ein moderner SQL-Dialekt wie BigQuery bietet eine hervorragende Lösung
Dies ist eine sehr leistungsfähige SQL-Syntax, um eine lange Liste von Spalten zu vermeiden, die aufgrund von Änderungen des Tabellenspaltennamens ständig aktualisiert werden müssen. Und diese Funktionalität fehlt in der aktuellen SQL Server-Implementierung, was schade ist. Hoffentlich wird Microsoft Azure eines Tages datenwissenschaftlerfreundlicher sein.
Datenwissenschaftler möchten eine schnelle Möglichkeit haben, eine Abfrage zu verkürzen und einige Spalten zu entfernen (aufgrund von Duplikaten oder aus anderen Gründen).
https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax#select-modifiers
quelle
Postgres SQL hat eine Möglichkeit, dies zu tun
Bitte beachten Sie: http://www.postgresonline.com/journal/archives/41-How-to-SELECT-ALL-EXCEPT-some-columns-in-a-table.html
Der Informationsschema-Hack-Weg
Das Obige für meine spezielle Beispieltabelle - generiert eine SQL-Anweisung, die so aussieht
SELECT o.officepark, o.owner, o.squarefootage FROM officepark As o
quelle
Ich kenne keine Datenbank, die dies unterstützt (SQL Server, MySQL, Oracle, PostgreSQL). Es ist definitiv nicht Teil der SQL-Standards, daher müssen Sie meiner Meinung nach nur die gewünschten Spalten angeben.
Sie können Ihre SQL-Anweisung natürlich dynamisch erstellen und vom Server ausführen lassen. Dies eröffnet jedoch die Möglichkeit einer SQL-Injection.
quelle
Ich weiß, dass dies ein bisschen alt ist, aber ich war gerade auf dasselbe Problem gestoßen und suchte nach einer Antwort. Dann ließ ich mir von einem erfahrenen Entwickler einen sehr einfachen Trick zeigen.
Wenn Sie den Management Studio-Abfrageeditor verwenden, erweitern Sie die Datenbank und anschließend die Tabelle, aus der Sie auswählen, damit Sie den Spaltenordner sehen können.
Markieren Sie in Ihrer select-Anweisung einfach den Ordner mit den referenzierten Spalten oben und ziehen Sie ihn per Drag & Drop in das Abfragefenster. Es werden alle Spalten der Tabelle eingefügt und dann einfach die Identitätsspalte aus der Liste der Spalten entfernt ...
quelle
SELECT * Except(tableName.ColumnName) FROM ...
Der beste Weg, dies zu lösen, ist die Verwendung der Ansicht. Sie können eine Ansicht mit den erforderlichen Spalten erstellen und Daten daraus abrufen
quelle
Wenn Sie eine Spalte mit sensiblen Groß- und Kleinschreibung wie beispielsweise das Kennwort ausschließen möchten, gehe ich folgendermaßen vor, um den Wert auszublenden:
SELECT * , "" as password FROM tableName;
quelle
Nun, es ist eine gängige bewährte Methode, anzugeben, welche Spalten Sie möchten, anstatt nur * anzugeben. Sie sollten also nur angeben, welche Felder Ihre Auswahl zurückgeben soll.
quelle
Ein Kollege riet zu einer guten Alternative:
Erledigt...
Das hat uns sehr geholfen.
quelle
Klicken Sie im Objekt-Explorer mit der rechten Maustaste auf die Tabelle. Wählen Sie die obersten 1000 Zeilen aus
Es werden alle Spalten aufgelistet und nicht *. Entfernen Sie dann die unerwünschten Spalten. Sollte viel schneller sein als selbst zu tippen.
Wenn Sie der Meinung sind, dass dies etwas zu viel Arbeit ist, rufen Sie die SQL-Eingabeaufforderung von Red Gate auf und geben Sie ssf von tbl ein. Gehen Sie zum * und klicken Sie erneut auf die Registerkarte.
quelle
Das, was ich für diesen Fall oft benutze:
@colnames
sieht aus wiecolumn1,column2,column5
quelle
Manchmal muss dasselbe Programm unterschiedliche Datenbankstrukturen verarbeiten. Daher konnte ich keine Spaltenliste im Programm verwenden, um Fehler in
select
Anweisungen zu vermeiden .*
gibt mir alle optionalen Felder. Ich überprüfe vor der Verwendung, ob die Felder in der Datentabelle vorhanden sind. Dies ist mein Grund für die Verwendung*
inselect
.So gehe ich mit ausgeschlossenen Feldern um:
quelle
Ich weiß, dass diese Frage alt ist, aber ich hoffe, dass dies dennoch hilfreich sein kann. Die Antwort wurde von einer Diskussion in den SQL Server-Foren inspiriert . Sie können dies zu einer gespeicherten Prozedur machen . Es kann auch geändert werden, um mehr als ein Ausnahmefeld hinzuzufügen.
quelle
Wäre es nicht einfacher, dies zu tun:
- Klicken Sie auf die Spalte 'Spaltenname'> Kopieren> Einfügen (erstellt eine vertikale Liste) in ein Fenster für neue Abfragen und geben Sie vor jedem Spaltenwert Kommas ein ... kommentieren Sie die nicht gewünschten Spalten aus ... weit weniger Eingabe als jeder hier angebotene Code und immer noch überschaubar.
quelle
Sie können SQL Complete von devart.com herunterladen, wodurch nicht nur der Platzhalter * wie bei SQL Prompt von Red Gate erweitert wird (wie in der Antwort von cairnz beschrieben), sondern auch eine Dropdown-Liste mit Spaltenauswahlfeldern bereitgestellt wird, in der Sie alle Kontrollkästchen aktivieren können Spalten, die Sie in die Auswahlliste aufnehmen möchten, werden automatisch für Sie eingefügt (und wenn Sie dann eine Spalte deaktivieren, wird sie automatisch aus der Auswahlliste entfernt).
quelle
In SSMS gibt es mit IntelliSense und Aliasing einen einfacheren Weg . Versuche dies
quelle