oraclesql中的关联查询

oraclesql中的关联查询,sql,oracle,correlated-subquery,Sql,Oracle,Correlated Subquery,我有三张桌子: Rent +++++++++++++++++++++++++++++++++++++++ | title | copy_num | member_id | date | +++++++++++++++++++++++++++++++++++++++ | ... |... |... |... | ++++++++++++++++++++++++++++++++++++++ Book ++++++++++++++++++++++++++++++++

我有三张桌子:

Rent
+++++++++++++++++++++++++++++++++++++++
| title | copy_num | member_id | date |
+++++++++++++++++++++++++++++++++++++++
| ...   |...       |...        |...   |
++++++++++++++++++++++++++++++++++++++

Book
+++++++++++++++++++++++++++++++++++++++++++++
|title   | publisher| writer | publish_date |
+++++++++++++++++++++++++++++++++++++++++++++
| ...    |...       |...     |...           |
+++++++++++++++++++++++++++++++++++++++++++++

Member
+++++++++++++++++++++
| id | name | phone |
+++++++++++++++++++++
| ...|...   |...    |
+++++++++++++++++++++
我想为每一位会员找到一位出版商,他租的印刷书籍最多。例如,如果一个成员租用了Hachette出版的更多书籍,那么结果应该是一行,表明这一事实。所有成员的结果表应类似于:

+++++++++++++++++++++++++++++++++++++++++++++++++++
| member_name | member_phone | favorite_publisher |
+++++++++++++++++++++++++++++++++++++++++++++++++++
| memberX     | 562214894    | Hachette           |
| ...         | ...          | ...                |
+++++++++++++++++++++++++++++++++++++++++++++++++++
例如,对于id为11111111且没有电话号码的特定成员,我可以使用以下查询:

SELECT id,
  publisher
FROM Rent R,
  Book B
WHERE R.member_id='11111111'
AND B.title     =R.title
GROUP BY member_id,
  publisher
HAVING COUNT(*)=
  (SELECT MAX(counter)
  FROM
    (SELECT member_id,
      publisher,
      COUNT(*) AS counter
    FROM Rent R,
      Book B
    WHERE R.member_id='11111111'
    AND B.title     =R.title
    GROUP BY member_id,
      publisher
    )
  ) ;
我不想使用PL-SQL来迭代上述查询。我只想使用SQL,但我不知道如何创建相关子查询,以便为每个成员创建相关子查询


编辑1:我不想使用分析函数来解决问题。我想只使用联接和相关子查询来解决此问题。

请尝试此方法。注意:我已经测试过了,因为我没有样本数据。您可能需要稍微修改一下

select member_name, member_phone, Title, Rent_Count
from
(
    select m.member_name, m.member_phone, r.Title
    ,(
        select count(title)
        from Book
        where title = r.title
    ) as Rent_Count
    from Member m
    inner join Rent r on (r.member_id = m.id)
) r
order by Rent_Count desc

此查询将从
rent
表中找到特定成员的发布者数量,然后找到获得所需结果的最大数量

试一试

 SELECT m.NAME       member_name,
       m.phone      member_phone,
       cq.publisher favorite_publisher
  FROM (SELECT COUNT(1) cc,
               MAX(COUNT(1)) over(PARTITION BY member_id) maxc,
               a.member_id,
               b.publisher
          FROM rent a
         INNER JOIN book b ON a.title = b.title
         GROUP BY a.member_id,
                  b.publisher) cq
 INNER JOIN MEMBER m ON m.id = cq.member_id
 WHERE maxc = cc;

您可以在Oracle中使用
keep
/
first
命令轻松完成此操作。(请详细阅读。)此操作使用子查询计算每个成员/发布者的计数,然后使用第二级保留顶级发布者:

select mp.name, mp.phone,
       max(mp.publisher) keep (dense_rank first order by cnt desc) as favorite_publisher
from (select m.name, m.phone, b.publisher, count(*) as cnt
      from member m join
           rent r
           on r.member_id = m.member_id join
           book b
           on r.title = b.title
      group by m.name, m.phone, b.publisher
     ) mp
group by mp.name, mp.phone;

这不是我正在寻找的解决方案,您的最外部查询没有意义,可以毫无问题地删除它。整个查询只会给我一个类似于三个表的简单联接的结果,rent_count的值为:每行1。您使用的是“over”和“partition by”,我想要一个不使用PL-SQL的解决方案,只是简单的SQL查询。这不是PL-SQL,它是使用分析函数的简单SQL。OK,我混淆了PL/SQL和分析函数,但如果我不想使用分析函数呢?是否可以只使用连接和相关子查询来解决这个问题?我不能使用PL-SQL。我正在学习SQL,在这个阶段我不能使用PL-SQL使事情变得更简单。@YoussefKhloufi。你指的是什么?这是一个标准的Oracle查询,不使用任何特定于PL/SQL的构造。好吧,我对PL/SQL和分析函数感到困惑,但是如果我不想使用分析函数呢?仅仅使用连接和相关子查询可以解决这个问题吗?是的,但没有理由这样做。对我来说,是的,这是有原因的,因为在开始学习分析函数和可以简化事情的PL/sql之前,我想学习sql来做复杂的事情。