sql查询帮助(计数)

sql查询帮助(计数),sql,h2,jooq,Sql,H2,Jooq,我有三张桌子 CUSTOMERS (CUSTOMER_ID, LASTNAME, FIRSTNAME, ... other fields) LICENSES(LICENSE_ID, CREATED_AT, RELEASE_ID, CUSTOMER_ID, ... other fields) RELEASES(RELEASE_ID, RELEASE_NAME, RELEASE_NUMBER, ... other fields) 在许可证中创建的是日期(非空)字段 表按同名主键/外键关联;客户可以

我有三张桌子

CUSTOMERS (CUSTOMER_ID, LASTNAME, FIRSTNAME, ... other fields)
LICENSES(LICENSE_ID, CREATED_AT, RELEASE_ID, CUSTOMER_ID, ... other fields)
RELEASES(RELEASE_ID, RELEASE_NAME, RELEASE_NUMBER, ... other fields)
在许可证中创建的是日期(非空)字段

表按同名主键/外键关联;客户可以拥有0个或多个许可证,并且每个许可证都有一个版本

我想从这些表格中得到:

客户的名字、姓氏和创建的最后一个许可证的发布id(根据许可证中的created_AT字段查找最后一个),如果有

对于这个问题,我使用了以下查询:

SELECT CUSTOMERS.FIRSTNAME,
       CUSTOMERS.LASTNAME,

  (SELECT RELEASES.RELEASE_ID
   FROM RELEASES
   INNER JOIN LICENSES ON LICENSES.RELEASE_ID = RELEASES.RELEASE_ID
   INNER JOIN CUSTOMERS AS t ON t.CUSTOMER_ID = LICENSES.CUSTOMER_ID
   WHERE t.CUSTOMER_ID = CUSTOMERS.CUSTOMER_ID
   ORDER BY LICENSES.CREATED_AT DESC LIMIT 1) AS REL_ID
FROM CUSTOMERS
WHERE EXISTS
    (SELECT 1
     FROM RELEASES
     INNER JOIN LICENSES ON LICENSES.RELEASE_ID = RELEASES.RELEASE_ID
     INNER JOIN CUSTOMERS AS t ON LICENSES.CUSTOMER_ID = t.CUSTOMER_ID
     AND t.CUSTOMER_ID = CUSTOMERS.CUSTOMER_ID)
这似乎有效,但我问是否有人可以证实我这一点,或者是否有可能使它更简单

我想从这些表中获得的其他数据是
RELEASES.RELEASE\u ID、RELEASES.RELEASE\u NAME、RELEASES.RELEASE\u NUMBER
,以及上一个许可证(根据在许可证中创建的)拥有此版本的客户数

我无法创建此查询。 我正在使用h2数据库

谢谢你的帮助

这个怎么样:

SELECT c.FIRSTNAME, c.LASTNAME, r.RELEASE_ID
FROM CUSTOMERS c
INNER JOIN LICENSES l ON (c.CUSTOMER_ID = l.CUSTOMER_ID)
INNER JOIN RELEASES r ON (r.RELEASE_ID = l.RELEASE_ID)

WHERE r.CREATED_AT = ( SELECT MAX(t.CREATED_AT) FROM RELEASES t
                       WHERE t.RELEASE_ID = r.RELEASE_ID )

由于内部联接,只有发布了版本的客户才会被列出。

这可能是等效的

SELECT CUSTOMERS.FIRSTNAME,
       CUSTOMERS.LASTNAME,
      (SELECT LICENSES.RELEASE_ID
       FROM LICENSES
       WHERE LICENSES.CUSTOMER_ID = CUSTOMERS.CUSTOMER_ID
       ORDER BY LICENSES.CREATED_AT DESC
       LIMIT 1) AS REL_ID
FROM CUSTOMERS
WHERE EXISTS (
    SELECT 1 
    FROM LICENSES
    WHERE LICENSES.CUSTOMER_ID = CUSTOMER.CUSTOMER_ID
)
如果您对
许可证有外键约束,则不需要加入所有这些表。RELEASE\u ID
LICENSES.CUSTOMER\u ID
。特别是,加入
RELEASES
表没有任何意义,因为
LICENSES.RELEASE\u ID
列已经包含所需的信息

在其他数据库中横向/交叉应用联接 为了完整性起见,如果这是PostgreSQL、Oracle、SQL Server等,您可以执行


这里实际上不需要
RELEASES
表。此外,结果集中缺少
发布ID
(使用最新的
许可证。在
日期创建)您是对的,我没有注意到该列。我已经更新了上面的查询谢谢你的回答,正如我在对卢卡斯回答的评论中所说,我的问题包括两个查询,我无法创建最后一个查询。嗨,谢谢你的回答和建议。我的问题包含两个查询,另一个在问题的最后部分,我无法创建它。您对此有什么建议吗?@res1:请在此提出一个关于堆栈溢出的新问题。未来的游客将更容易了解正在发生的事情。。。
SELECT CUSTOMERS.FIRSTNAME,
       CUSTOMERS.LASTNAME,
       l.RELEASE_ID
FROM CUSTOMERS 
CROSS JOIN LATERAL (
    SELECT *
    FROM LICENSES
    WHERE LICENSES.CUSTOMER_ID = CUSTOMERS.CUSTOMER_ID
    ORDER BY LICENSES.CREATED_AT DESC
    LIMIT 1
) l