SQL 服务器 - 将相同的 ID 授予 "matching" 变量 ID
SQL Server - Granting same IDs to "matching" Variables IDs
这个标题一开始可能听起来有点混乱,但我希望我的例子能阐明我的意图。
ID1 ID2 uniqueidentifier
A14 A21
A14 A55
A21 A14
A21 A55
A55 A14
A55 A21
...
A123 A22
A22 A123
...
ID 后面是我根据某些条件匹配的公司名称。
基本上显示的示例意味着,ID 'A14' 与 'A21' 匹配,但也可以反过来(当然)。还有第三个公司名称符合条件。
我无法按公司名称对它们进行分组,因为有时名称的写法会有所不同,如下所示:
- 示例公司 Corp.
- Example Company Corp.
基本上前 6 行将具有相同的标识符。还有另外两个。
此时 uniqueidentifier 将是一个新的,因为我想用 NEWID().
更新这个 table
问题是:如何分配唯一标识符 (NEWID()) 使其看起来像输出
对我的问题有什么建议吗?
我很乐意提供任何形式的帮助,因为这是我思考了很长时间的问题。
编辑:预期输出如下所示:
ID1 ID2 uniqueidentifier
A14 A21 XXER-WQEE-...
A14 A55 XXER-WQEE-...
A21 A14 XXER-WQEE-...
A21 A55 XXER-WQEE-...
A55 A14 XXER-WQEE-...
A55 A21 XXER-WQEE-...
...
A123 A22 IOKK-Q23A-...
A22 A123 IOKK-Q23A-...
...
谢谢
毫克
我觉得这个应该能给你想要的结果。抱歉,有点乱。如果您需要解释,请提出问题。
DECLARE @Table1 TABLE (ID1 varchar(100), ID2 varchar(100), uniqueid uniqueidentifier)
INSERT @Table1
( ID1, ID2, uniqueid )
VALUES
( '1', '2', NULL ),
( '2', '1', NULL ),
( '2', '3', NULL ),
( '3', '2', NULL ),
( '1', '3', NULL ),
( '3', '1', NULL ),
( '4', '5', NULL ),
( '5', '4', NULL )
DECLARE @tmp VARCHAR(100)
DECLARE @NewID UNIQUEIDENTIFIER
DECLARE @ID2 TABLE (ID2 varchar(100))
WHILE EXISTS (SELECT 1 FROM @Table1 WHERE uniqueid IS NULL)
BEGIN
SET @NewID = NEWID()
SELECT @tmp = ID1
FROM @Table1
WHERE uniqueid IS NULL
DELETE @ID2
UPDATE @Table1
SET uniqueid = @NewID
OUTPUT Inserted.ID2
INTO @ID2
WHERE ID1 = @tmp
WHILE EXISTS (SELECT 1 FROM @ID2 JOIN @Table1 ON [@Table1].ID1 = [@ID2].ID2 WHERE [@Table1].uniqueid IS NULL)
BEGIN
UPDATE t1
SET uniqueid = @NewID
OUTPUT Inserted.ID2
INTO @ID2
FROM @Table1 t1
JOIN @ID2 id2 ON t1.ID1 = id2.ID2
END
END
SELECT * FROM @Table1
情况变了,我需要修改代码。
某些 ID 已具有唯一标识符。
上面发布的代码(@Valera Soroka)仅考虑唯一标识符为 NULL 的 ID。这意味着如果第 1-2 行已经有一个唯一标识符,它将在示例中为第 3-6 行授予新的唯一标识符。代码需要先查找带有uniqueidentifier的ID。
此外,我想添加国家/地区,因此循环性能更高,因为循环仅通过具有相同国家/地区的 ID。所以国家需要在代码中实现。
所以实际情况是这样的:
ID1 ID2 Country(ID1) uniqueidentifier
A14 A21 USA XXER-WQEE-...
A14 A55 USA XXER-WQEE-...
A21 A14 USA
A21 A55 USA
A55 A14 USA
A55 A21 USA
...
A123 A22 Canada
A22 A123 Canada
...
预期输出应如下所示:
ID1 ID2 Country(ID1) uniqueidentifier
A14 A21 USA XXER-WQEE-...
A14 A55 USA XXER-WQEE-...
A21 A14 USA XXER-WQEE-...
A21 A55 USA XXER-WQEE-...
A55 A14 USA XXER-WQEE-...
A55 A21 USA XXER-WQEE-...
...
A123 A22 Canada IOKK-Q23A-...
A22 A123 Canada IOKK-Q23A-...
...
(我只是取了上面相同的ID,ID可以是任何ID)
非常感谢您的帮助!
毫克
这个标题一开始可能听起来有点混乱,但我希望我的例子能阐明我的意图。
ID1 ID2 uniqueidentifier
A14 A21
A14 A55
A21 A14
A21 A55
A55 A14
A55 A21
...
A123 A22
A22 A123
...
ID 后面是我根据某些条件匹配的公司名称。 基本上显示的示例意味着,ID 'A14' 与 'A21' 匹配,但也可以反过来(当然)。还有第三个公司名称符合条件。
我无法按公司名称对它们进行分组,因为有时名称的写法会有所不同,如下所示:
- 示例公司 Corp.
- Example Company Corp.
基本上前 6 行将具有相同的标识符。还有另外两个。 此时 uniqueidentifier 将是一个新的,因为我想用 NEWID().
更新这个 table问题是:如何分配唯一标识符 (NEWID()) 使其看起来像输出
对我的问题有什么建议吗?
我很乐意提供任何形式的帮助,因为这是我思考了很长时间的问题。
编辑:预期输出如下所示:
ID1 ID2 uniqueidentifier
A14 A21 XXER-WQEE-...
A14 A55 XXER-WQEE-...
A21 A14 XXER-WQEE-...
A21 A55 XXER-WQEE-...
A55 A14 XXER-WQEE-...
A55 A21 XXER-WQEE-...
...
A123 A22 IOKK-Q23A-...
A22 A123 IOKK-Q23A-...
...
谢谢 毫克
我觉得这个应该能给你想要的结果。抱歉,有点乱。如果您需要解释,请提出问题。
DECLARE @Table1 TABLE (ID1 varchar(100), ID2 varchar(100), uniqueid uniqueidentifier)
INSERT @Table1
( ID1, ID2, uniqueid )
VALUES
( '1', '2', NULL ),
( '2', '1', NULL ),
( '2', '3', NULL ),
( '3', '2', NULL ),
( '1', '3', NULL ),
( '3', '1', NULL ),
( '4', '5', NULL ),
( '5', '4', NULL )
DECLARE @tmp VARCHAR(100)
DECLARE @NewID UNIQUEIDENTIFIER
DECLARE @ID2 TABLE (ID2 varchar(100))
WHILE EXISTS (SELECT 1 FROM @Table1 WHERE uniqueid IS NULL)
BEGIN
SET @NewID = NEWID()
SELECT @tmp = ID1
FROM @Table1
WHERE uniqueid IS NULL
DELETE @ID2
UPDATE @Table1
SET uniqueid = @NewID
OUTPUT Inserted.ID2
INTO @ID2
WHERE ID1 = @tmp
WHILE EXISTS (SELECT 1 FROM @ID2 JOIN @Table1 ON [@Table1].ID1 = [@ID2].ID2 WHERE [@Table1].uniqueid IS NULL)
BEGIN
UPDATE t1
SET uniqueid = @NewID
OUTPUT Inserted.ID2
INTO @ID2
FROM @Table1 t1
JOIN @ID2 id2 ON t1.ID1 = id2.ID2
END
END
SELECT * FROM @Table1
情况变了,我需要修改代码。
某些 ID 已具有唯一标识符。
上面发布的代码(@Valera Soroka)仅考虑唯一标识符为 NULL 的 ID。这意味着如果第 1-2 行已经有一个唯一标识符,它将在示例中为第 3-6 行授予新的唯一标识符。代码需要先查找带有uniqueidentifier的ID。
此外,我想添加国家/地区,因此循环性能更高,因为循环仅通过具有相同国家/地区的 ID。所以国家需要在代码中实现。
所以实际情况是这样的:
ID1 ID2 Country(ID1) uniqueidentifier
A14 A21 USA XXER-WQEE-...
A14 A55 USA XXER-WQEE-...
A21 A14 USA
A21 A55 USA
A55 A14 USA
A55 A21 USA
...
A123 A22 Canada
A22 A123 Canada
...
预期输出应如下所示:
ID1 ID2 Country(ID1) uniqueidentifier
A14 A21 USA XXER-WQEE-...
A14 A55 USA XXER-WQEE-...
A21 A14 USA XXER-WQEE-...
A21 A55 USA XXER-WQEE-...
A55 A14 USA XXER-WQEE-...
A55 A21 USA XXER-WQEE-...
...
A123 A22 Canada IOKK-Q23A-...
A22 A123 Canada IOKK-Q23A-...
...
(我只是取了上面相同的ID,ID可以是任何ID)
非常感谢您的帮助! 毫克