SQL Server - 为“匹配”变量ID

时间:2016-09-21 09:35:21

标签: sql-server matching identifier

这个标题在开头可能听起来有点令人困惑但我希望我的例子澄清我的意图。

ID1      ID2   uniqueidentifier

A14      A21
A14      A55
A21      A14
A21      A55
A55      A14
A55      A21
...
A123     A22
A22      A123
...

在ID后面有一个公司根据某些标准命名我匹配的。 基本上,显示的示例意味着ID'A14'与'A21'匹配,但反过来(当然)。并且有第三个公司名称符合标准。

我无法按公司名称对它们进行分组,因为名称的编写方式有时不同,如下所示:
- 示例公司公司
- 示例公司公司

基本上前6行将具有相同的标识符。另外两个也是。 此时,uniqueidentifier将是一个新的,因为我想用NEWID()更新此表。

问题是:我如何分配uniqueidentifiers(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-...
...

由于 MG

2 个答案:

答案 0 :(得分:1)

我认为这个应该给你想要的结果。对不起,这有点乱。如果您需要解释,请提出问题。

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

答案 1 :(得分:-1)

情况发生了变化,我需要修改代码。
发生一些ID已经具有uniqueidentifier。

上面公布的代码(由@Valera Soroka提供)仅考虑uniqueidentifier为NULL的ID。这意味着如果第1-2行已经有uniqueidentifier,它将为示例中的第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)

非常感谢你的帮助! MG