Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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 派生在多个列上匹配但某些列值可能为NULL的记录组_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 派生在多个列上匹配但某些列值可能为NULL的记录组

Sql 派生在多个列上匹配但某些列值可能为NULL的记录组,sql,sql-server,tsql,Sql,Sql Server,Tsql,我想要一种有效的方法,可以跨多个字段导出匹配记录组。假设我有下表: 创建表cust id INT不为空, 类VARCHAR1 NULL, cust_类型VARCHAR1 NULL, 术语VARCHAR1 NULL ; 插入cust 价值观 1、'A',空,'C',和, 2,NULL,'B','C',和, 3、'A','B',空, 4,空,空,'C', 5,'D','E',空, 6,'D',空,空; 我希望得到的是一组ID,匹配的值将一组记录统一到三个字段类、cust_type和terms上,这样

我想要一种有效的方法,可以跨多个字段导出匹配记录组。假设我有下表:

创建表cust id INT不为空, 类VARCHAR1 NULL, cust_类型VARCHAR1 NULL, 术语VARCHAR1 NULL ; 插入cust 价值观 1、'A',空,'C',和, 2,NULL,'B','C',和, 3、'A','B',空, 4,空,空,'C', 5,'D','E',空, 6,'D',空,空; 我希望得到的是一组ID,匹配的值将一组记录统一到三个字段类、cust_type和terms上,这样我就可以为组应用唯一的ID

在本例中,记录1-4构成三个字段上的一个匹配组,而记录5-6构成单独的匹配

以下内容将完成此工作:

**但是,有更好的方法吗?**在超过一百万行的表上运行此查询是痛苦的。。。 正如Graham在评论中指出的那样,如果添加了另一条将所有记录分组在一起的记录,则上述查询不满足要求

应将以下值分组为一组:

INSERT INTO cust
VALUES
    (1,'A',NULL,'C'),
    (2,NULL,'B','C'),
    (3,'A','B',NULL),
    (4,NULL,NULL,'C'),
    (5,'D','E',NULL),
    (6,'D',NULL,NULL),
    (7,'D','B','C');
将产生:

id match_group
-- -----------
 1 1
 2 1
 3 1
 4 1
 5 1
 6 1
…因为D组的类值记录为5、6和7。C的术语值将记录1、2和4与该组匹配,而cust_类型值B或类值A则拉入记录3


希望这一切都有意义。

我认为递归选择无法实现这一点。 我做了类似的事情,尝试使用临时表识别独特的家庭&使用以下逻辑重复更新:

对于每个类别| cust|u type |术语,获取最小id并更新临时表:

update temp
from
 (
  SELECT
    class, -- similar for cust_type & terms
    min(id) as min_id
  from temp
  group by class
 ) x
set id = min_id
where temp.class = x.class
  and temp.id <> x.min_id
;

重复所有三次更新,直到没有一次更新一行。

你能用文字解释记录是如何“匹配”的吗?如果你的数据有D/B/C,那么我认为你的匹配不起作用。你需要把逻辑想得更清楚一点。@TT。在这种情况下,我的意思是针对特定列的值是相同的。因此,id=1的类值与id=3的类值相同,因此我知道它们表示相同的cust实体。@Lee Ok,因此1和3匹配,但您声明1、2、3和4在三个字段上都匹配到一个组中。最好有一个正式的解释来表明这些记录都属于同一个组。@GordonLinoff-Gah-是的,你是对的。但是,如果有另一个记录具有这些值,我希望查询返回一个分组ID,即统一所有记录的类和术语值。。。有什么想法吗?
update temp
from
 (
  SELECT
    class, -- similar for cust_type & terms
    min(id) as min_id
  from temp
  group by class
 ) x
set id = min_id
where temp.class = x.class
  and temp.id <> x.min_id
;