2017-06-10 5 views
0

Wie gibt man nur Zeilen aus einer SQL-Tabelle zurück, deren Eintrag in einer bestimmten Spalte eindeutig ist?Nur Zeilen aus einer SQL-Tabelle zurückgeben, deren Eintrag in einer bestimmten Spalte eindeutig ist

Zum Beispiel

Lassen Sie uns sagen, dass ich die Tabelle haben:

FRUIT COLOR 
_____________ 

apple green  
apple red  
peach blue 
banana red 

Ich möchte eine PostgreSQL-Abfrage schreiben, die deren Eintrag in der FRUIT Spalte nur die Zeilen zurückgibt eindeutig zuzuordnen sind, die in diesem Fall bedeutet, dass die letzten 2 Zeilen zurückgegeben werden. Wie mache ich das? Vielen Dank.

Antwort

0

Typische SQL-Syntax für bestimmte Spalte ist, dass

SELECT * FROM (
    SELECT FRUIT, Count(FRUIT) AS NUM_OF_FRUITS FROM MyTable 
    GROUP BY City) 
WHERE NUM_OF_FRUITS = 1 

den Pfirsich und Banane gibt, aber wenn Sie ganze Reihe nehmen möchten, können Sie unter SQL-Syntax als

SELECT * FROM MyTable 
WHERE FRUIT IN (
    SELECT * FROM (
     SELECT FRUIT, Count(FRUIT) AS NUM_OF_FRUITS FROM MyTable 
     GROUP BY City) 
    WHERE NUM_OF_FRUITS = 1 
) 

verwende ich nehme an, es ist ausreichend für deine Frage.

+0

können wir COUNT (Frucht) nicht haben 'in where-Klausel ohne die Unterabfrage? – niceman

+0

@niceman Wir können 'COUNT (FRUIT)' in der Klausel 'HAVING' haben. – Abelisto

+0

@Abelisto, aber das würde eine 'GROUP BY' benötigen, die tatsächlich die Unterabfrage benötigt, um das zurückzuliefern, was wir wollen (außer OP könnte' GROUP BY's Ausgabe akzeptieren) – niceman

1

Dies ist eine elementare Übung zur Verwendung der having Klausel. Lesen Sie die Dokumentation: Aggregate Functions und vergleichen Sie diese Abfragen:

select fruit, count(*) 
from my_table 
group by 1; 

fruit | count 
--------+------- 
banana |  1 
peach |  1 
apple |  2 
(3 rows) 


select fruit 
from my_table 
group by 1 
having count(*) = 1; 

fruit 
-------- 
banana 
peach 
(2 rows) 
+0

Was ist, wenn OP die ganzen Reihen haben wollte? – niceman

+0

Er könnte ein Aggregat verwenden, z.B. 'max (Farbe)' in auswählen. – klin

+0

kann nicht sagen, ich hatte viel Glück, diese Arbeit zu machen – Thoth

1

Wenn Sie ganze Reihe benötigen zu bekommen,

1) Verwenden Sie having und join:

select t.* 
from 
    my_table as t join (
    select fruit 
    from my_table 
    group by fruit 
    having count(*) = 1) as f on (t.fruit = f.fruit); 

2) Verwenden Fensterfunktion:

select * 
from (
    select *, count(*) over (partition by fruit) as cnt 
    from my_table) as t 
where 
    cnt = 1; 
0

Hier ist nur ein weiterer Ansatz mit window function zusammen mit der WITH Klausel:

WITH f AS (
    SELECT fruit, color, count(fruit) OVER (PARTITION BY fruit) AS count 
    FROM fruits 
) 
SELECT f.* FROM f WHERE f.count = 1; 

fruit | color | count 
--------+-------+------- 
banana | red |  1 
peach | blue |  1 
(2 rows) 
Verwandte Themen