Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 基于对一对多表中的列进行计数,高效地获取最近的id_Sql_Join_Count_Teradata_Relational - Fatal编程技术网

Sql 基于对一对多表中的列进行计数,高效地获取最近的id

Sql 基于对一对多表中的列进行计数,高效地获取最近的id,sql,join,count,teradata,relational,Sql,Join,Count,Teradata,Relational,我有一个关系表(一对多),我需要有效地获得ID之间的相似性,这些ID提供了相关的项。桌子是这样的: id item 1 A2231 1 A2134 2 A2134 2 B2313 ... 我需要的是得到所有ID之间共有多少行: a_id b_id count_items 1 2 1 1 3 0 2 1 1 ... 我已经做了一个查询,但它是o(n2),它不工作,因为spool空间 SELECT A.ID AS a_

我有一个关系表(一对多),我需要有效地获得ID之间的相似性,这些ID提供了相关的项。桌子是这样的:

id  item 
1   A2231
1   A2134
2   A2134
2   B2313
... 
我需要的是得到所有ID之间共有多少行:

a_id  b_id  count_items
1     2     1 
1     3     0
2     1     1 
...
我已经做了一个查询,但它是o(n2),它不工作,因为spool空间

SELECT A.ID AS a_id, B.ID AS b_id, COUNT(B.item) AS count_items
FROM Tab AS A LEFT JOIN  Tab AS B --same table
ON (A.item = B.item)
GROUP BY A.ID, B.ID
编辑:

有没有一种方法可以有效地实现这一点?
提前谢谢

我将从使用内部联接开始:

SELECT A.ID, B.ID, COUNT(*) AS count_items
FROM Tab A LEFT JOIN
     Tab B --same table
     ON A.item = B.item
GROUP BY A.ID, B.ID;
接下来,如果您的表有重复项,那么这可能会起作用:

with t as (
      select distinct id, item
      from tab
     )
select a.id, b.id, count(*)
from t a join
     t b
     on a.item = b.item
group by a.id, b.id;
最后,如果需要所有项目对,则:

with t as (
      select distinct id, item
      from tab
     )
select i1.id, i2.id, count(b.id)
from (select distinct id from tab) i1 cross join
     (select distinct id from tab) i2 left join
     t a
     on t.id = i1.id left join
     t b
     on b.id = i2.id and a.item = b.item
group by i1.id, i2.id;

你能分享一些数据吗:行数,项目数,每项最多行数?id/项目组合是否唯一?@dnoeth;已编辑)最佳可能的解决方案:对
项进行PI,如果仍在进行假脱机,您可以针对较小的子集运行它,例如每批10000项。顺便说一句,您可能需要添加另一个条件
(A.ID B.ID)
,否则您永远不会得到零计数(并且不需要外部联接)。请阅读并执行。PS“它是o(n2)”&“不起作用,因为”的含义含糊不清。最大结果大小为输入大小的o(n2);那没办法。但这并不意味着结果必须占用那么多临时内存。也没有那么多时间。这取决于执行情况。特别是在DDL索引上,它的空间仍然存在问题,有没有办法不进入o(n2)组合?
with t as (
      select distinct id, item
      from tab
     )
select i1.id, i2.id, count(b.id)
from (select distinct id from tab) i1 cross join
     (select distinct id from tab) i2 left join
     t a
     on t.id = i1.id left join
     t b
     on b.id = i2.id and a.item = b.item
group by i1.id, i2.id;