Postgresql

限制嵌套 INNER JOIN 表中的記錄數

  • January 12, 2022

上下文如下:

  • 我們有 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 | 第四名

引用自:https://dba.stackexchange.com/questions/305944