当前位置: 首页 > 知识库问答 >
问题:

sql查询帮助(计数)

闻人献
2023-03-14

我有3张桌子

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)

许可证中的CREATED_AT是一个日期(非空)字段。

表根据同名主键/外键进行关联;客户可以拥有0个或多个许可证,每个许可证都有一个版本。

我想从这些表格中得到:

客户的名字、姓氏和创建的最后一个许可证的release\u id(根据许可证中的created\u 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)

这似乎有效,但我问是否有人可以证实我这一点,或者是否有可能使它更简单。

我想从这些表中获得的其他数据是发布版。RELEASE\u ID,RELEASES。RELEASE\u NAME,RELEASES。RELEASE\u NUMBER和上次获得此版本许可证的客户数(根据许可证中的CREATED\u)。

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

谢谢你的帮助

共有2个答案

齐乐
2023-03-14

这个怎么样:

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 )

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

沈思博
2023-03-14

这可能是等效的

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
)

如果许可证上有外键约束,则不需要加入所有这些表。发布ID和许可证。客户ID。特别是,加入发布表没有意义,因为许可证。RELEASE\u ID列已包含所需信息。

为了完整性起见,如果这是PostgreSQL、Oracle、SQL Server等,则可以执行横向连接,也称为交叉应用

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
 类似资料:
  • 问题内容: 我想从t1中获取名称,并在t2中获得与ID在t1上相同的行数。 到目前为止,我已经掌握了上述内容,但是如果t2中没有匹配的行,它将不会返回任何数据。如果没有行,则我希望将其设置为0(或NULL),并且名称仍然返回。 编辑: 我希望能够按降序排序。(或ASC)可行吗? 问题答案: 这应该为您工作: 左联接确保您拥有t1中的所有行,而COUNT(。)使其仅计算t2.id不为null的记录(

  • 问题内容: 我需要从下表中删除半重复记录 对于存在的任何重复PID,我想删除最低得分记录。在上面的示例中,将删除ID 1。我试图提出一种不使用循环的方法,但确实很挣扎。 任何帮助,将不胜感激。 谢谢 问题答案:

  • 我的问题类似于SQL选择组查询。但是架构发生了变化,我想要不同的结果,如下所述。给定链接的解决方案没有给我正确的解决方案。您可以使用SQL小提琴来解决这个问题。 下面是我的桌子 表1 现在,我想显示每个产品的两个最低金额,如果金额相同,那么任何人都按照升序排列... 所以我想构建单个SQL查询,它给我的结果如下。 请帮我建立这样的查询。

  • 问题内容: 我有一张桌子,上面有一张图表中的数据。 例如 我需要一个查询,该查询返回值在局部最大值处的结果,即特定索引处的值大于index + 1和index-1处的值。 因此,对于示例集,它应返回索引列表:2、6、9,它们对应于值7、12、14。 我在SQLite中使用PHP。我可以用php中的foreach循环来做到这一点,但想知道是否有一种简单的方法可以仅使用SQL命令来做到这一点。 任何输

  • 问题内容: 我正在尝试构造一个查询,该查询将包括指示用户是否下载了文档的列。我有一个名为HasDownloaded的表,其中包含以下各列:id,documentID,memberID。找出用户是否下载了 特定 文档很容易;但我需要生成一个查询,其结果将如下所示: 该ID并不是很重要;我感兴趣的是文档是否已下载(是否为NULL)。 这是我的查询: 问题是,只有在HasDownloaded表中存在指定