Wie Entferne ich "doppelte" Zeilen aus einer Ansicht?
Habe ich eine Sicht, die gut funktioniert, wenn ich war bei meiner Haupt-Tabelle:
LEFT OUTER JOIN OFFICE ON CLIENT.CASE_OFFICE = OFFICE.TABLE_CODE.
Aber ich brauchte, um fügen Sie den folgenden anzuschließen:
LEFT OUTER JOIN OFFICE_MIS ON CLIENT.REFERRAL_OFFICE = OFFICE_MIS.TABLE_CODE
Obwohl ich Hinzugefügt DISTINCT
bekomme ich noch eine "doppelte" Reihe. Ich sagen Sie "duplizieren", da die zweite Zeile einen anderen Wert hat.
Jedoch, wenn ich den LEFT OUTER
zu einem INNER JOIN
verliere ich alle Zeilen für die Kunden, die diese "doppelten" Zeilen.
Was mache ich falsch? Wie Entferne ich diese "doppelten" Zeilen aus meiner Sicht?
Hinweis:
Diese Frage ist nicht anwendbar in diesem Beispiel:
Würden Sie Geist Reinigung Ihrer Frage und mit code-Blöcke mit mehr explizite Beispiele nennen?
InformationsquelleAutor Fet | 2009-07-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
DISTINCT dir nicht helfen, wenn die Zeilen alle Spalten, die anders sind. Offensichtlich, eine der Tabellen, die Sie verknüpfen, um mehrere Zeilen für eine einzige Zeile in einer anderen Tabelle. Um eine Zeile zurück, die Sie haben, zu beseitigen die andere mehrere Zeilen in der Tabelle, die Sie verknüpfen.
Der einfachste Weg, dies zu tun ist, um verbessern Sie Ihre where-Klausel oder JOIN Beschränkung auf nur beitreten, um den einzelnen Datensatz, den Sie möchten. Normalerweise ist dies erfordert die Festlegung einer Regel, die werden immer wählen die "richtigen" Eintrag aus der anderen Tabelle.
Lassen Sie uns annehmen, du hast ein einfaches problem wie dieses:
Wenn Sie erstellen ein einfach hier anmelden, erhalten Sie zwei Einträge für Jane:
Dies ist völlig richtig, wenn der Punkt, der Ihrer Ansicht ist die Liste aller Kombinationen von Menschen und Haustieren. Allerdings, wenn Ihr Blick war stattdessen soll die Liste der Menschen, die mit Haustieren, oder die Liste mit Personen und anzuzeigen Ihre Haustiere, Sie trifft das problem, das Sie jetzt haben. Dazu müssen Sie in der Regel.
Was dieser tut, ist eine Regel anwenden zu beschränken, die Haustiere Datensatz in der join auf das Tier mit der niedrigsten ID (die ersten in die Haustiere-Tabelle). Die WHERE-Klausel besagt im wesentlichen, "wo es keine Haustiere, die zu den gleichen person mit niedriger ID-Wert).
Dies ergäbe eine ein Rekordergebnis:
Der Regel müssen Sie anwenden, um Ihre anzeigen wird, hängt von den Daten in den Spalten, die Sie haben, und welche die "multiple" - Datensätze angezeigt werden soll, in die Spalte. Allerdings wird, dass wind-up versteckt einige Daten, die möglicherweise nicht, was Sie wollen. Z. B. die obige Regel verbirgt die Tatsache, dass Jane einen Hund hat. Es macht es den Anschein, als ob Jane hat nur eine Katze, wenn diese nicht korrekt ist.
Müssen Sie möglicherweise zu überdenken, den Inhalt von Ihrer Ansicht, und was Sie versuchen zu erreichen, mit Ihrer Ansicht, wenn Sie anfangen, heraus zu filtern, die gültige Daten.
das ist eine interessante Art, es zu tun. Ist das schneller als die wählen Sie 1 top-sub-query in meine Antwort?
Ich bin mir nicht sicher, ob es schneller als die wählen Sie top, aber ich wollte zeigen ein Allgemeines Beispiel für die Anwendung einer Regel. Die oben wählen Sie haben könnte, hatte auch eine völlig andere WHERE-Klausel, oder vielleicht eine Beschränkung auf die VERKNÜPFUNG, um zu sagen "wo Haustiere.Name = 'Cat'". Das Konzept ist, dass eine Regel benötigt wird, und es muss spezifisch sein, um die Ansicht entwickelt wird, und der Kontext der Daten, die benötigt werden, vorgestellt.
InformationsquelleAutor Jay S
Wenn die secondd Zeile hat einen anderen Wert, als es ist nicht wirklich duplizieren und sollten mit einbezogen werden.
InformationsquelleAutor Hunter
Damit Sie einen left outer join, matching zwei Zeilen? OFFICE_MIS.TABLE_CODE nicht eindeutig in die Tabelle nehme ich an? Sie brauchen, um zu verhindern, dass "join", um nur schnappen Sie sich eine Reihe. Es hängt davon ab, welche Zeile, die Sie suchen, aber Sie können etwas tun, wie dieses...
InformationsquelleAutor dotjoe
Anstatt
DISTINCT
könnten Sie einGROUP BY
.MIN
/MAX
/AVG
oder eine andere Funktion zu geben, Sie eine Ergebnis für Felder, die könnten mehrere Werte zurückgegeben werden.Beispiel:
InformationsquelleAutor Lieven Keersmaekers
Sie könnten versuchen, mit Distinct Top 1 aber als Jäger wies darauf hin, dass, wenn es, wenn auch eine Spalte anders ist, dann sollte er entweder im Lieferumfang enthalten oder, wenn Sie nicht kümmern oder muss die Spalte, die Sie sollte wahrscheinlich es zu entfernen. Andere Vorschläge würde wahrscheinlich erfordern weitere spezifische Informationen.
EDIT: Bei der Verwendung Distinct Top 1, brauchen Sie eine entsprechende Gruppe von - Anweisung. Sie würde wirklich mit dem Top 1 Teil. Das Distinct ist es da, wenn es ein Unentschieden für den Top 1 werden Sie einen Fehler erhalten, ohne einen Weg zur Vermeidung einer Band. Die zwei häufigsten Arten, die ich gesehen habe sind das hinzufügen Verschiedene zu Top 1 oder fügen Sie eine Spalte in der Abfrage, ist so einmalig, dass sql würde eine Möglichkeit haben, zu wählen, welcher Datensatz zu Holen, was sonst eine Band.
Vielen Dank Rich B.-ich werde Ihren Vorschlag.
Danke Bryan. Ich gelten Ihren Vorschlag.
Ihre Lösung hat funktioniert gut für mich bisher. Ich konnte nicht ändern Sie die Abfrage komplett anders, beinhaltet die VERKNÜPFUNG zwischen 5 Tabellen und eine UNION zwischen 3 solcher Abfragen. Danke.
InformationsquelleAutor Bryan