Frage

Wie wählt man alle Felder zweier verbundener Tabellen aus, ohne dass es zu Konflikten mit dem gemeinsamen Feld kommt?

Angenommen, ich habe zwei Tische, Products Und Services.Ich möchte eine Abfrage wie diese stellen:

SELECT Products.*, Services.* 
FROM Products 
INNER JOIN Services ON Products.IdService = Services.IdService

Das Problem bei dieser Abfrage ist Folgendes IdService erscheint zweimal und führt zu einer Reihe von Problemen.

Die Alternative, die ich bisher gefunden habe, besteht darin, jedes Feld zu unterscheiden Products außer der IdService eins.Aber auf diese Weise muss ich die Abfrage jedes Mal aktualisieren, wenn ich ein neues Feld hinzufüge Products.

Gibt es einen besseren Weg, dies zu tun?

War es hilfreich?

Lösung

Was sind die häufigsten SQL anti-Muster ?

Sie getroffen haben anti-Muster # 1.

Der bessere Weg ist es, eine Feldliste zur Verfügung zu stellen. Eine Möglichkeit, eine schnelle Feldliste zu erhalten ist,

sp_help tablename

Und wenn Sie möchten, eine Ansicht von dieser Abfrage erstellen - wählen Sie mit * bringen Sie in mehr Mühe. SQL Server fängt die Spaltenliste zum Zeitpunkt der Ansicht erstellt wird. Wenn Sie die zugrunde liegenden Tabellen bearbeiten und sie neu erstellen nicht die Ansicht - Sie unterschreiben für Probleme (ich ein Produktions Feuer dieser Art hatte - Blick gegen Tabellen in einer anderen Datenbank obwohl).

Andere Tipps

Sie sollten NIE SELECT * in Produktionscode (na ja, fast nie, aber die Zeiten, in denen es gerechtfertigt ist, kann leicht gezählt werden).

Soweit ich weiß, du wirst SELECT * vermeiden müssen aber this't wirklich ein Problem.

ist SELECT * in der Regel als ein Problem angesehen wartet auf den Grund, den Sie als Vorteil zitieren geschehen! In der Regel zusätzliche Ergebnisse Spalten erscheinen, für Abfragen, wenn die Datenbank geändert wurde, wird zu Problemen führen.

Gibt es in Ihrem Dialekt von SQL-Unterstützung COMPOSE? COMPOSE wird der zusätzlichen Kopie der Spalte befreien, die auf einem Equijoin verwendet wird, wie das in Ihrem Beispiel.

Wie andere bereits gesagt haben, ist Select * eine schlechte Nachricht, insbesondere wenn den Tabellen, in denen Sie Abfragen durchführen, andere Felder hinzugefügt werden.Sie sollten genau die gewünschten Felder aus den Tabellen auswählen und können einen Alias ​​für Felder mit demselben Namen verwenden oder einfach table.columnName verwenden.

Verwenden Sie keine *. Verwenden Sie so etwas wie folgt aus:

SELECT P.field1 AS 'Field from P'
     , P.field2
     , S.field1 AS 'Field from S'
     , S.field4 
  FROM Products P
       INNER JOIN 
       Services S
       ON P.IdService = S.IdService

Das wäre richtig, listen Sie die Felder, die Sie wollen (in SQL Server können Sie sie ziehen aus dem Objekt-Browser über, so müssen Sie sie nicht geben alle). Übrigens, wenn es Felder, spezifische Abfrage doe nicht benötigen, sie nicht auflisten. Dies schafft zusätzliche Arbeit für den Server und nutzt zusätzliche Netzwerk-Ressourcen und kann eine der Ursachen für eine schlechte Leistung sein, wenn es thoughout Ihr System und so verschwenderisch Abfragen laufen tausende Male am Tag durchgeführt wird.

Wie es ein Wartungsproblem zu sein, müssen Sie nur die Felder hinzufügen, wenn der Teil der Anwendung, die Ihre Abfrage verwendet würde von ihnen betroffen sein. Wenn Sie nicht wissen, was Auswirkungen auf das neue Feld haben würde oder wo Sie es hinzufügen müssen, sollten Sie nicht das Feld hinzufügen. Auch das Hinzufügen neuer fileds unexopectedly durch die Verwendung von select * können Wartungsprobleme als auch verursachen. Erstellen von Leistungsproblemen zu vermeiden Wartung zu tun (Wartung können Sie noch nie tun müssen, um als Spaltenänderungen selten sein sollten (wenn sie nicht Sie an Ihrem Design suchen müssen)) ist ziemlich kurzsichtig.

Der beste Weg ist, um die genauen Felder angeben, die Sie aus der Abfrage werden sollen. Sie sollten sowieso nicht verwenden *.

Es ist bequem * zu verwenden, um alle Felder zu bekommen, aber nicht robust Code erzeugen. Jede Änderung in der Tabelle wird das Ergebnis ändern, die von der Abfrage zurückgegeben wird, und das ist nicht immer wünschenswert.

Sie sollten zurückkehren nur die Daten, die Sie wirklich aus der Abfrage wollen, genau in der angegebenen Reihenfolge Sie es wollen. Auf diese Weise ist das Ergebnis sieht genau die gleiche, auch wenn Sie Felder in die Tabelle oder ändern Sie die Reihenfolge der Felder in der Tabelle hinzuzufügen.

Es ist ein litte mehr Arbeit, die genaue Ausgabe zu spezifizieren, aber auf lange Sicht lohnt es sich in der Regel aus. Wenn Sie eine Änderung vornehmen, nur das, was Sie tatsächlich betroffen ändern, bekommt man nicht Effekte Kaskadierung, die Code bricht, die Sie nicht einmal betroffen war wusste.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top