gpt4 book ai didi

sql - 将多个选择查询合并为一个以避免多次传递一个巨大的表

转载 作者:可可西里 更新时间:2023-11-01 15:05:14 24 4
gpt4 key购买 nike

手头问题的非常简化的设置。

表 A 有列 rz_id 和 sHashA。表 A 很大。

表 B 有列 scode 和 sHashB。可以有很多 sHashB 值对应于特定的 scode 值。 B表比较多比表 A 小。

对于每个 scode 值(大约 200 个),我必须执行如下查询(在本例中 scode 为 500)。

select count(distinct rz_id) from A where substr(sHashA, 1, 5) in (select substr(sHashB, 1, 5) from B where scode = 500);

对于每个 scode 值,我都编写了一个类似上面的查询,这样我最终得到了 200 个这样的查询

select count(distinct rz_id) from A where substr(sHashA, 1, 5) in (select substr(sHashB, 1, 5) from B where scode = 500);
select count(distinct rz_id) from A where substr(sHashA, 1, 5) in (select substr(sHashB, 1, 5) from B where scode = 501);
select count(distinct rz_id) from A where substr(sHashA, 1, 5) in (select substr(sHashB, 1, 5) from B where scode = 502);
.
.
.
select count(distinct rz_id) from A where substr(sHashA, 1, 5) in (select substr(sHashB, 1, 5) from B where scode = 700);

问题是这最终会遍历大表 200 次这很耗时。我希望能够通过单次通过(单次查询)。

我想做一个表,行数和A表一样多通过类似查询的其他列作为表 B

select /*+ streamtable(a) */ a.*, if(substr(sHashA, 1, 5) in (select
substr(sHashB, 1, 5) from B where scode = 500, 1, 0) as scode_500,
if(substr(sHashA, 1, 5) in (select substr(sHashB, 1, 5) from B where
scode = 501, 1, 0) as scode_501, ... if(substr(sHashA, 1, 5) in
(select substr(sHashB, 1, 5) from B where scode = 700, 1, 0) as
scode_700 from A a;

这将在表 A 的每行对应于 scode 的 200 列中的每一列中输出 0 或 1。稍后我可以对列求和以获得计数。由于我也对估计任何两个 scode 之间的计数重叠感兴趣,因此我想到了上表。

但我收到解析错误,我怀疑内部不允许查询IF 语句。

最后的问题是:我如何将所有这些查询减少到一个查询中,以便我最终只遍历大表的行一次?还请建议处理此计数的替代方法,同时记住我也对重叠感兴趣。

最佳答案

像这样的事情怎么样;

select count(distinct A.rz_id), B.scode
from A,B
where substr(A.sHashA, 1, 5) = substr(B.sHashB, 1,5)
and B.scode in (500,501,...)
group by B.scode

单遍获取所有数据

关于sql - 将多个选择查询合并为一个以避免多次传递一个巨大的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32605621/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com