Postgresql
限制嵌套 INNER JOIN 表中的記錄數
上下文如下:
- 我們有 3 張桌子:我們稱它們為 A、B 和 C。
- A 有一個外鍵引用表 B,我們稱之為“bId”。關係是多對一。(B 中的一條記錄可以連結到 A 中的多條記錄,但 A 中的每條記錄都連結到 B 中的一條記錄)
- B 有一個外鍵引用表 C,我們稱之為“cId”。和之前一樣,關係是 ManyToOne C 中的一條記錄可以連結到 B 中的多條記錄,但是 B 中的每條記錄都連結到 C 中的一條記錄)。
現在,問題如下: 到目前為止,為了關聯這 3 個表之間的資訊,我使用了表單的查詢
A inner join B inner join C WHERE b.someField = 'x' AND a.otherField = 'y'
,然後使用程式語言處理聚合資訊。我的問題是,是否可以限製表 C 中的條目數?
假設 C 有一個名為 name 的欄位,我只想要前 3 個 C 值中的數據,按字母順序排列。類似於我的問題似乎是這裡回答的問題,但我不知道如何概括解決方案。
需要明確的是,我一般不想限制記錄的數量,只限制第三個表中的記錄數。
這是如何實現這一目標的一個小例子。
SELECT A.id, A.otherfield, B.id, B.somefield, C.id, C.name FROM A JOIN B ON A.bid = B.id JOIN C ON B.cid = C.id AND b.someField = 'x' AND a.otherField = 'y' AND C.name IN ( SELECT C.name FROM C ORDER BY C.name DESC LIMIT 3 ) ;
範例表和數據以及此答案的語句可以在db<>fiddle (PostgreSQL 14)上找到。
此處全文轉載:
CREATE TABLE A (id int, bid int, otherField varchar(10));
✓
CREATE TABLE B (id int, cid int, someField varchar(10));
✓
CREATE TABLE C (id int, AName varchar(10));
✓
INSERT INTO C (id, AName) VALUES (1, 'FirstName'), (2, 'SecondName'), (3, 'ThirdName'), (4, 'FourthName') ;
4 行受影響
INSERT INTO B (id, cid, someField) VALUES (1,1,'x'), (1,2,'x'), (1,3,'x'), (1,4,'x'), (2,1,'x'), (2,2,'x'), (2,3,'y'), (2,4,'y'), (3,1,'x'), (3,2,'z'), (3,3,'y'), (3,4,'y'), (4,1,'y'), (4,2,'x'), (4,3,'x'), (4,4,'x') ;
16 行受影響
INSERT INTO A (id,bid,otherField) VALUES (1,1,'x'), (1,2,'x'), (1,3,'x'), (1,4,'x'), (2,1,'x'), (2,2,'x'), (2,3,'y'), (2,4,'y'), (3,1,'x'), (3,2,'z'), (3,3,'y'), (3,4,'y'), (4,1,'y'), (4,2,'x'), (4,3,'x'), (4,4,'x') ;
16 行受影響
SELECT A.id, A.otherField, B.id, B.someField, C.id, C.AName FROM A JOIN B ON A.bid = B.id JOIN C ON B.cid = C.id AND b.someField = 'x' AND a.otherField = 'y' AND C.AName IN ( SELECT C.AName FROM C ORDER BY C.AName DESC LIMIT 3 ) ;
編號 | 其他領域 | 編號 | 某地 | 編號 | 一個名字 -: | :--------- | -: | :-------- | -: | :--------- 2 | 是 | 4 | x | 2 | 第二個名字 2 | 是 | 4 | x | 3 | 第三名 2 | 是 | 4 | x | 4 | 第四名 3 | 是 | 4 | x | 2 | 第二個名字 3 | 是 | 4 | x | 3 | 第三名 3 | 是 | 4 | x | 4 | 第四名 4 | 是 | 1 | x | 2 | 第二個名字 4 | 是 | 1 | x | 3 | 第三名 4 | 是 | 1 | x | 4 | 第四名