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来做复杂的事情。