2012-04-04 8 views
0

Also habe ich diese Abfrage und es ist aus den Tabellen wie folgt ziehen:Wie in einer Abfrage zu sagen Ich will keine Duplikate?

Plantation TABLE

PLANT ID, Color Description 
1   Red 
2   Green 
3   Purple 

Gemüse Tabelle

VegetabkeID, PLANT ID, Feeldesc 
199   1  Harsh 
200   1  Sticky 
201   2  Bitter 
202   3  Bland 

und jetzt in meiner Abfrage ich join them PLANT-ID verwendet (I Verwenden Sie eine linke Verbindung)

PLANT ID, Color Description, Feeldesc 
1   Red    Harsh    
1   Red    Sticky 
2   Green    Bitter 
3   Purple   Bland 

So die pr Das Problem ist, dass in der Abfrage Rot doppelt angezeigt wird! Ich kann das nicht haben, und Ich bin mir nicht sicher, wie man die Joins passieren kann, aber halte Rot zweimal davon ab.

+2

Für zwei 'rote' Einträge haben Sie verschiedene 'Feeldesc'-Werte, also welchen möchten Sie zurückgeben? – sll

+1

Was würden Sie mit dem obigen Ergebnis passieren? Da 'Red Harsh' und' Red Sticky' gleichermaßen korrekt sind und Sie einen eliminieren möchten, müssen Sie sich für eine Regel entscheiden. –

+0

Nun, welche Reihe willst du vom Gemüsetisch ??? – dotjoe

Antwort

1

Es scheint, entfernt möglich, dass Sie fragen, wie zu Gruppenanzeige - das heißt, zeigt einen Wert, der identifiziert oder beschreibt eine Gruppe nur in der ersten Zeile dieser Gruppe. In diesem Fall möchten Sie die Fensterfunktion "lag()" verwenden.

Unter der Annahme, Aufbau des Schemas und Daten ist wie folgt:

create table plant (plantId int not null primary key, color text not null); 
create table vegetable (vegetableId int not null, plantId int not null, 
      Feeldesc text not null, primary key (vegetableId, plantId)); 
insert into plant values (1,'Red'),(2,'Green'),(3,'Purple'); 
insert into vegetable values (199,1,'Harsh'),(200,1,'Sticky'), 
          (201,2,'Bitter'),(202,3,'Bland'); 

Die Ergebnisse, die Sie (Modul Spaltenüberschriften) zeigen mit dieser einfachen Abfrage erhalten werden kann:

select p.plantId, p.color, v.Feeldesc 
    from plant p left join vegetable v using (plantId) 
    order by plantId, vegetableId; 

Wenn Sie Um die Anzeige der wiederholten Informationen nach der ersten Zeile zu unterdrücken, wird diese Abfrage es tun:

Die Ergebnisse sehen wie folgt aus:

plantid | color | feeldesc 
---------+--------+---------- 
     1 | Red | Harsh 
     |  | Sticky 
     2 | Green | Bitter 
     3 | Purple | Bland 
(4 rows) 

ich so etwas wie die oben gerade in dieser Woche zu tun hatte, eine Liste direkt aus psql zu erzeugen, die für den Endverbraucher leicht war, zu lesen; Sonst wäre mir nie in den Sinn gekommen, dass Sie nach dieser Funktionalität fragen könnten. Hoffentlich beantwortet das deine Frage, obwohl ich vielleicht völlig daneben liege.

0

prüfen array_agg Funktion in der Dokumentation kann es so etwas wie folgt verwendet werden:

SELECT 
    v.plantId 
    ,v.color 
    ,array_to_string(array_agg(v.Feeldesc),', ') 
FROM 
    vegetable 
    INNER JOIN plant USING (plantId) 
GROUP BY 
    v.plantId 
    ,v.color 

oder

SELECT DISTINCT 
    v.plantId 
    ,v.color 
FROM 
    vegetable 
    INNER JOIN plant USING (plantId) 

Laimer verwenden: Hand geschrieben, Syntaxfehler zu erwarten :)

Verwandte Themen