【发布时间】:2016-10-28 22:51:00
【问题描述】:
我一直在阅读以下 Microsoft article 关于使用 CTE 进行递归查询的内容,但我似乎无法理解如何将其用于组常见项目。
我有一个包含以下列的表格:
- 身份证
- 名字
- 姓氏
- 出生日期
- 出生国家
- 组ID
我需要做的是从表格中的第一个人开始,遍历表格并找到所有相同(LastName 和 BirthCountry)或相同(DateOfBirth 和 @)的人987654325@)。
现在棘手的部分是我必须为他们分配相同的GroupID,然后对于该GroupID 中的每个人,我需要查看其他人是否有相同的信息,然后将它们放入相同的@987654328 @。
我想我可以用多个游标来做到这一点,但它变得越来越棘手。
这是示例数据和输出。
ID FirstName LastName DateOfBirth BirthCountry GroupID
----------- ---------- ---------- ----------- ------------ -----------
1 Jonh Doe 1983-01-01 Grand 100
2 Jack Stone 1976-06-08 Grand 100
3 Jane Doe 1982-02-08 Grand 100
4 Adam Wayne 1983-01-01 Grand 100
5 Kay Wayne 1976-06-08 Grand 100
6 Matt Knox 1983-01-01 Hay 101
John Doe 和 Jane Doe 属于同一个组 (100),因为它们具有相同的(姓氏和出生国)。
Adam Wayne 属于第 (100) 组,因为他与 John Doe 具有相同的(出生日期和出生国家/地区)。
Kay Wayne 在组 (100) 中,因为她与已经在组 (100) 中的 Adam Wayne 具有相同的(姓氏和出生国)。
Matt Knox 加入了一个新组 (101),因为他与之前组中的任何人都不匹配。
Jack Stone 在组 (100) 中,因为他与已经在组 (100) 中的 Kay Wayne 具有相同的(出生日期和出生国家/地区)。
数据脚本:
CREATE TABLE #Tbl(
ID INT,
FirstName VARCHAR(50),
LastName VARCHAR(50),
DateOfBirth DATE,
BirthCountry VARCHAR(50),
GroupID INT NULL
);
INSERT INTO #Tbl VALUES
(1, 'Jonh', 'Doe', '1983-01-01', 'Grand', NULL),
(2, 'Jack', 'Stone', '1976-06-08', 'Grand', NULL),
(3, 'Jane', 'Doe', '1982-02-08', 'Grand', NULL),
(4, 'Adam', 'Wayne', '1983-01-01', 'Grand', NULL),
(5, 'Kay', 'Wayne', '1976-06-08', 'Grand', NULL),
(6, 'Matt', 'Knox', '1983-01-01', 'Hay', NULL);
【问题讨论】:
-
为什么 HV 填充 GROUPID ?假设 groupid 是您需要的输出,那么应该从哪个 groupid 开始?100?为什么 groupid 应该从 100 开始?
-
@goroth 你提到了
CURSOR。我相信它应该能够解决您的问题。你已经完成了一些事情吗? -
至少不要尝试Cursor。
-
@ydoow 我确实让它在某种程度上可以使用双光标和临时表,但它非常缓慢和混乱。
标签: sql-server recursion