2017-04-26 6 views
0

Ich möchte eine Abfrage, die alle Kunden auflistet, deren Status "aktiv" ist. Diese Abfrage würde eine Liste der Kunden zurückgeben, die als aktiv markiert sind. Mein Problem ist, dass ich bei der Abfrage von Tabellen verloren bin, die auf andere Tabellen verweisen. Hier ist mein Schema.PostgreSQL Abfrage durch Schemas

CREATE TABLE Customer (
    ID BIGSERIAL PRIMARY KEY NOT NULL, 
    fNAME TEXT NOT NULL, 
    lNAME TEXT NOT NULL, 
    create_date DATE NOT NULL DEFAULT NOW() 
); 

CREATE TABLE CustomerStatus (
    recordID BIGSERIAL NOT NULL, 
    ID BIGSERIAL REFERENCES Customer NOT NULL, 
    status TEXT NOT NULL, 
    create_date DATE NOT NULL DEFAULT NOW() 
); 

INSERT INTO Customer (fNAME, lNAME) VALUES ('MARK', 'JOHNSON'), ('ERICK', 'DAWN'), ('MAY', 'ERICKSON'), ('JESS', 'MARTIN'); 

INSERT INTO CustomerStatus (ID, status) VALUES (1, 'pending'), (1, 'active');  

INSERT INTO CustomerStatus (ID, status) VALUES (2, 'pending'), (2, 'active'), (2, 'cancelled');  

INSERT INTO CustomerStatus (ID, status) VALUES (3, 'pending'), (3, 'active'); 

INSERT INTO CustomerStatus (ID, status) VALUES (4, 'pending'); 
+0

Es gibt einige seltsame Dinge in Ihrem Schema. 1. Die Bedingung "Customer.ID NOT NULL" ist redundant. 2. Warum hat CustomerStatus.ID den Typ BIGSERIAL? Ich denke, es sollte BIGINT sein. 3. Hauptfrage (Sie sollten es in Frage stellen) - Kann 1 Kunde mehrere KundenStatus haben? Wenn yes (und die CustomerStatus-Tabelle so etwas wie CustomerStatusHistory enthält), fügen Sie dem CustomerStatus die Einschränkung UNIQUE (ID, create_date) hinzu. Andernfalls ist die Einschränkung UNIQUE (ID) und der Kunde kann nur einen Status haben. – Eugene

+0

fester Dank für das Ausrufen der Entlassungen – MarkM

Antwort

0

Ich habe Mut, dass record_id seriell = annehmen,> die neuesten id würde die letzte sein, diese qry zu produzieren:

t=# with a as (
    select *, max(recordid) over (partition by cs.id) 
    from Customer c 
    join CustomerStatus cs on cs.id = c.id 
) 
select * 
from a 
where recordid=max and status = 'active'; 
id | fname | lname | create_date | recordid | id | status | create_date | max 
----+-------+----------+-------------+----------+----+--------+-------------+----- 
    1 | MARK | JOHNSON | 2017-04-27 |  2 | 1 | active | 2017-04-27 | 2 
    3 | MAY | ERICKSON | 2017-04-27 |  7 | 3 | active | 2017-04-27 | 7 
(2 rows) 

Time: 0.450 ms