Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.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 避免成对的笛卡尔积检查_Sql_Sql Server_Cartesian Product - Fatal编程技术网

Sql 避免成对的笛卡尔积检查

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的

我在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

这个过程只处理数据的一个子集,但我正在寻找关于如何将其扩展到完整数据集的建议


请让我知道,如果你想要任何其他细节。谢谢

如果我理解正确,您可以使用联接来执行此操作。如果您对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;