oracle 如果嵌套子查询的目的是对表之间的值进行计数,那么它看起来会是什么样子?

5ssjco0h  于 2022-11-03  发布在  Oracle
关注(0)|答案(2)|浏览(131)

表[...]具有以下相关属性:
RENTAL**(成员标识,职务标识)**
MEMBER**(成员标识,姓氏,名字)**
此任务是统计每个成员借阅某本书的次数。例如,member_id102的成员在title_id99的书的租赁表中可能有2个条目。对于每个成员,显示他借阅每本书的次数。
现在,我的(糟糕的)想法是这样的:

SELECT m.member_id, r.title_id, m.last_name, m.first_name, count(*)
FROM (SELECT rr.title_id, m.member_id
      FROM rental rr
      WHERE rr.title_id > = r.title_id and m.member_id = rr.title_id)   
FROM member m,
     rental r  
WHERE m.member_id = r.member_id

它不起作用,如果有人指导我做错了什么,我会很感激

doinxwow

doinxwow1#

像这样试试...

Select
    m.MEMBER_ID,
    m.LAST_NAME,
    m.FIRST_NAME,
    r.TITLE_ID,
    Count(r.TITLE_ID)  "BORROWED"
FROM
    MEMBER m
INNER JOIN 
    RENTAL r ON(r.MEMBER_ID = m.MEMBER_ID) 
GROUP BY
    m.MEMBER_ID,
    m.LAST_NAME,
    m.FIRST_NAME,
    r.TITLE_ID

如果您链接数据表,您仍然可以使用汇总函数,例如Count(),并依未汇总的数据行来群组数据。这样应该可以完成工作。此致...

5hcedyr0

5hcedyr02#

在Oracle 12中,可以使用LATERAL联接:

SELECT m.member_id, 
       m.last_name,
       m.first_name,
       r.num_rentals
FROM   member m
       CROSS JOIN LATERAL (
         SELECT title_id,
                COUNT(*) AS num_rentals
         FROM   rental r
         WHERE  m.member_id = r.member_id
         GROUP BY
                r.title_id
       ) r

或者您可以使用LEFT OUTER JOIN

SELECT m.member_id, 
       m.last_name,
       m.first_name,
       r.title_id,
       COALESCE(r.num_rentals, 0) AS num_rentals
FROM   member m
       LEFT OUTER JOIN (
         SELECT member_id,
                title_id,
                COUNT(*) AS num_rentals
         FROM   rental
         GROUP BY
                member_id,
                title_id
       ) r
       ON (m.member_id = r.member_id)

或者,将聚合移动到外部查询:

SELECT m.member_id, 
       MAX(m.last_name) AS last_name,
       MAX(m.first_name) AS first_name,
       r.title_id,
       COUNT(r.title_id) AS num_rentals
FROM   member m
       LEFT OUTER JOIN rental r
       ON (m.member_id = r.member_id)
GROUP BY
       -- group by the primary key
       m.member_id,
       r.title_id

如果您使用INNER JOIN,则当成员没有借阅任何书籍时,您将不会得到任何结果。
fiddle

相关问题