查询中每个元素两行

时间:2018-07-11 21:43:47

标签: sql firebird

在Firebird 2.1中,我有两个简单的表:

发票: InvocesID, ClientID, .....

客户: ClientID, GroupID, Name .......

当我选择

 SELECT   
       I.*   
 FROM 
       INVOICES I  
       LEFT JOIN CLIENT C ON C.ClientId=I.ClientID  
 WHERE 
    C.GroupID = 15  // for instance

然后我有所有发票。如何在groupid =15中为每个客户仅获得2张发票?

1 个答案:

答案 0 :(得分:1)

最精巧的方法(不是最佳解决方案,但可以在任何Firebird版本中使用,尤其是在您的远古2.1版本中):

SELECT
    I.*
FROM
    CLIENT C
    INNER JOIN INVOICES I ON C.ClientId = I.ClientID AND I.InvocesID >=
    (SELECT FIRST 1 SKIP 1 I2.InvocesID FROM INVOICES I2 WHERE I2.ClientId = I.ClientID ORDER BY I2.InvocesID DESC)
WHERE
    C.GroupID = 15

我假设您最新的发票编号更大。 另外,由于您对发票感兴趣,因此我将left join更改为inner join。如果您还需要退回没有发票的客户,请将其更改为LEFT JOIN

如果您不需要2,但例如4的发票只需将SKIP 1更改为SKIP 3