Sql 避免成对的笛卡尔积检查
我在SQL Server 2014中有两个表: 表A包含三列:组、过程和日期 表B包含四列:Proc1、Proc2、Start、End 表B是一组进程对的列表,如果组中的最小日期介于开始和结束之间,则这些进程对不应出现在表a的同一组中。我试图找到表A中违反此规则的组,但问题是表A有6000万个组,每个组最多有100行,表B有65000对 其他DEET: End可以为空 Proc1和Proc2的长度始终为5个字符,但Proc可以是任意长度 我的策略是 对于A中的每个组,获取最小日期,并将Proc的所有唯一值填充到一个新的Proc字段中,该字段从不包含逗号。产生表C和组MinDate进程 以C和B的笛卡尔积为例,其中i MinDate在Start和End之间,或>Start和End为NULL,ii如果我将其中的Proc1和Proc2的实例替换为空字符串,则proc的长度将减少10 这个过程只处理数据的一个子集,但我正在寻找关于如何将其扩展到完整数据集的建议Sql 避免成对的笛卡尔积检查,sql,sql-server,cartesian-product,Sql,Sql Server,Cartesian Product,我在SQL Server 2014中有两个表: 表A包含三列:组、过程和日期 表B包含四列:Proc1、Proc2、Start、End 表B是一组进程对的列表,如果组中的最小日期介于开始和结束之间,则这些进程对不应出现在表a的同一组中。我试图找到表A中违反此规则的组,但问题是表A有6000万个组,每个组最多有100行,表B有65000对 其他DEET: End可以为空 Proc1和Proc2的长度始终为5个字符,但Proc可以是任意长度 我的策略是 对于A中的每个组,获取最小日期,并将Proc的
请让我知道,如果你想要任何其他细节。谢谢 如果我理解正确,您可以使用联接来执行此操作。如果您对b中的每一行都有一个唯一的标识符,这会有所帮助 方法是将表连接在一起,然后计算b中每行的冲突数: 如果没有b.id,可以使用这四列来标识每一行 进程长度的具体数据问题是另一个问题。您应该修复数据,使两个表之间应该匹配的字段实际上具有相同的类型。请回答您的问题,并添加一些示例数据和基于该数据的预期输出。请
select a.group, b.id, count(distinct a.proc) as num_procs
from a join
b
on a.proc in (b.proc1, b.proc2) and
a.date between b1.start and coalesce(b1.end, getdate())
group by a.group, b.id
having count(distinct a.proc) = 2;