2016-08-08 71 views
1

Ich habe zwei Tabellen, aus denen ich einen Join mit einigen Spalten machen möchte, um eine Ansicht für meine Java/Hibernate-Anwendung bereitzustellen. Es sieht wie folgt aus:Wie verwendet man DISTINCT in VIEWS korrekt?

CREATE VIEW customer_contacts AS cc 
SELECT DISTINCT ON (cust.id) cust.id 
    cust.company 
    cust.zip 
    ... 
    con.name 
    con.forename 
    ... 
FROM contacts con 
LEFT JOIN customer cust ON con.customer = cust.id 
ORDER BY cust.id 

So weit so gut. Sehr einfach. Wenn ich eine SELECT auf der Ansicht machen wie:

SELECT * 
FROM cc 
WHERE name ilike '%schult%' 

ich 13 Ergebnisse.

Wenn ich die gleiche Abfrage direkt mit der Ansicht Aussage machen

SELECT DISTINCT ON (cust.id) cust.id 
    cust.company 
    cust.zip 
    ... 
    con.name 
    con.forename 
    ... 
FROM contacts con 
LEFT JOIN customer cust ON con.customer = cust.id 
WHERE name ilike '%schult%' 
ORDER BY cust.id 

Ich habe 75 Ergebnisse! Ich fand heraus, dass es die DISTINCT ist, die das Ergebnis korrumpiert. Aber warum?

Und wie kann ich es richtig verwenden?

+3

zeigen Bitte geben Sie den genauen SQL Text der "gleichen Abfrage", die ausgeführt werden. –

+0

Hallo Peter, ich habe meine Frage geklärt und die direkte Aussage geschrieben. – M46

+0

Aber Sie haben die Bedingung 'WHERE name ilike '% schult%'' in Ihrer zweiten Abfrage vergessen ... –

Antwort

1

Ihre Anfragen (Ansicht basiert und direkt) haben unterschiedliche Reihenfolge der Anwendung Bedingung:

  • direkte Abfrage sucht nach %shult% und wendet dann distinct on
  • Ansicht gilt distinct on und sucht dann nach %shult%

Wissen Sie, wie funktioniert ? Es wählt die erste Zeile (es kann unbestimmbar sein, wenn die richtige Sortierung nicht definiert ist) für bestimmte Attribute und verlässt andere.

Zum Beispiel:

Lassen Sie sich sagen, wir haben Kunden mit id=1 und zwei miteinander verbundenen Kontakten eines mit name='Schultz' und einem mit name='Schmidt'. Jetzt wird die Ansicht based select angewendet distinct on und wählen Sie einen Kunden mit einem Kontakt (der erste, undefined in diesem Fall), dann wird angewendet - es kann passieren, dass Schultz von distinct on entfernt wird.


Empfohlene Lektüre:

https://www.postgresql.org/docs/9.0/static/sql-select.html#SQL-DISTINCT

+0

Danke. Ihr erster Punkt ist klar und ich habe es im Postgre Doc gefunden. Der zweite nicht. Aber meine Frage bleibt: Wie kann ich es richtig machen? Ich meine, wie bekomme ich das Ergebnis, das ich vielleicht ohne die Aussicht will? Ich verwende Hibernate und möchte keine Abfrage verwenden. Deshalb möchte ich eine Ansicht verwenden. – M46

+0

Und übrigens. Das Ergebnis in diesem speziellen Fall wird dasselbe sein, da es keine Duplikate gibt. Also sollte die Reihenfolge keine Rolle spielen. Bei anderen Abfragen ist es möglich. – M46

+0

Ich verstehe es nicht: "Es gibt keine Duplikate". Wenn keine Duplikate vorhanden wären, würden beide Abfragen dieselben Daten zurückgeben. –