2017-08-28 71 views
1

當我在Postgres的兩個表使用極限。我想從表格中獲取最新的3條記錄數據。無法使用相關的查詢

下面是查詢:

select two.sid as sid, 
     two.sidname as sidname, 
     two.myPercent as mypercent, 
     two.saccur as saccur, 
     one.totalSid as totalSid 
from table1 one,table2 two 
where one.sid = two.sid; 

上面的查詢顯示所有記錄檢查情況one.sid = two.sid;我想只有近3個記錄從數據(4,5,6)表2。

我知道Postgres裏,我們可以使用limit限制要檢索的行,但在這裏,表2中的每個ID我有多行。所以我想我不能在table2上使用限制,但應該在table1上使用。有什麼建議麼?

表1:

sid totalSid 
1 10 
2 20 
3 30 
4 40 
5 50 
6 60 

表2:

sid sidname myPercent saccur 
1 aaaa  11 11t 
1 bbb   13 13g 
1 ccc   11 11g 
1 qw   88 88k 
//more data for 2,3,4,5.... 
6 xyz 89 895W  
6 xyz1  90 90k 
6 xyz2  91 91p 
6 xyz3  92 92q 
+0

查找使用'你的極限,而不是一個'交叉join'或交叉apply''的, '加入我認爲posgresql稱這是一個橫向連接。 https://stackoverflow.com/questions/11472790/postgres-analogue-to-cross-apply-in-sql-server你如何識別「最近?」 – xQbert

+0

或使用窗口函數,如row_number()。 – wildplasser

+0

所以我不能使用LIMIT上述場景? – user7833845

回答

1

給出一個改變理解問題的簡單子查詢,並加入應該足夠了。

我們選擇了從表1的限制,以3個記錄SID順序遞減。這給了我們最近的3個Sid,然後加入到table2以獲得其他SID相關數據。這裏的假設是SID在表1中是唯一的,「最近的」將是具有最高SID的那些記錄。

SELECT two.sid as sid 
    , two.sidname as sidname 
    , two.myPercent as mypercent 
    , two.saccur as saccur 
    , one.totalSid as totalSid 
FROM (SELECT * FROM table1 ORDER BY SID DESC LIMIT 3) one 
INNER JOIN table2 two 
    ON one.sid = two.sid; 

* note我在上面的一個別名後面刪除了一個逗號。

和下面我們恢復了88 ANSI使用,符號連接語法。

SELECT two.sid as sid 
    , two.sidname as sidname 
    , two.myPercent as mypercent 
    , two.saccur as saccur 
    , one.totalSid as totalSid 
FROM (SELECT * FROM table1 ORDER BY SID DESC LIMIT 3) one 
    , table2 two 
WHERE one.sid = two.sid; 

這句法基本上說,從表中的一個獲得3個最近的SID和交叉(兩個對於每個記錄在一個匹配它的所有記錄)加入,爲所有記錄在表中的兩個,但那麼只返回記錄中雙方都有相同的SID。現代編譯器可能能夠使用基於成本的優化來提高性能,否則無需執行整個交叉連接;然而,操作順序說這是數據庫通常必須做的事情。如果一個和兩個都是規模很大的兩個表,可以看到交叉連接可能會導致非常大的臨時數據集

+1

是的,我們可以。我在上面的第二條SQL語句中重新訪問了ansi 89標準。 – xQbert

+0

根據「SETS」處理/思考數據,您需要一組數據,這是最近3次SID,然後您需要改進該數據集以包含表2中的相關信息。因此,我們首先得到一組3最近的記錄,然後我們加入到表二來獲取相關信息。通過使用子查詢,我們強制引擎「生成」該設置,然後我們可以使用它來限制表2中的數據!那簡單的 – xQbert

+0

LOL @'我重新訪問了ansi 89標準'。下一步是如果引擎不實現LIMIT(在子查詢中...) – wildplasser