无法获得不同的记录

时间:2013-01-10 04:02:54

标签: sql sql-server

我有一个包含ID的表,并带有备用标识符。

ID| Alternate
1 | 100000000
1 | 8471
1 | 1248

2 | 578887518
2 | 8415
2 | 3574

3 | 100000000
3 | 1248

有两种类型的备用标识符.9位数和4位数。每个ID,有一个9位数的替代,然后最多四个不同的4位数。

我的问题是该表不是唯一的。存在类似于上述示例ID 1和3的情况。可能存在情况,虽然我还没有找到一个,其中9位数字标识符匹配,但是存在不同的4位数标识符。

ID | Alternate
5  | 200000000
5  | 1234

6  | 200000000
6  | 4567

我的目标是创建一个表,并在备用标识符值上进行透视,但是我目前为同一个用户获取两行。

有人知道如何解决这个问题吗? 当前代码

SELECT  ID,  [THCI], [2101] , [2202], [2245] 
FROM          
    (SELECT     
        T1.[ID], 
        T1.[IDENTIFIER],
        CASE WHEN T2.[MAIN_IDENT] IS NULL THEN 'THCI' ELSE T2.[MAIN_IDENT] END AS PIV

    FROM MYTABLE T1
        LEFT OUTER JOIN TABLE2 AS T2 ON T2.[REFNO] = T1.[REFNO]
    WHERE 
        (LEN(T2.[MAIN_IDENT]) = 4 OR T2.[MAIN_IDENT] IS NULL)
        AND (LEN(T1.[IDENTIFIER]) = 4 OR LEN(T1.[IDENTIFIER]) = 9)
    ) AS SourceTable 
PIVOT (MAX([IDENTIFIER]) FOR PIV IN ([THCI], [2245], [2202], [2101],[2345],[2303])) AS MYPIV

编辑: 预期的产出将是。另请注意,它是四个备用标识符,而不是三个。虽然不会改变很多

[ID] | [THCI]      | [2245] | [2202] | [2101] | [2345] 
1    | 100000000   | 4817   | 6824   | NULL   | 1587
2    | 845279514   | 2359   | 7847   | 1234   | NULL
3    | 415784521   | 2415   | NULL   | NULL   | 8747

1 个答案:

答案 0 :(得分:0)

如果您的目标只是检索省略重复值的数据,可以先检索9个字符IDENTIFIER的数据(按MAX(ID)分组),然后使用同一个表加入已过滤4个字符IDENTIFIER。因此,内部SELECT语句看起来与此类似(在其上应用PIVOT):

SELECT 
    IDENT9.ID,
    IDENT9.IDENTIFIER,
    IDENT4.IDENTIFIER
FROM
    (SELECT     
    MAX([ID]) ID, 
    [IDENTIFIER],
    FROM MYTABLE
    WHERE LEN([IDENTIFIER]) = 9
    GROUP BY [IDENTIFIER]) AS IDENT9
LEFT OUTER JOIN
    (SELECT     
    MAX([ID]) ID, 
    [IDENTIFIER],
    FROM MYTABLE
    WHERE LEN([IDENTIFIER]) = 4
    GROUP BY [IDENTIFIER]) AS IDENT4
ON IDENT4.ID = IDENT9.ID

这里的想法是在单独的列中包含9个字符的标识符和4个字符的标识符。 IDENT4和IDENT9视图的目的是删除重复项。

但是,如果您的目标是修复数据库完整性,那么您需要考虑在两个单独的表中分隔9个字符和4个字符的标识符。根据您的说法,我可以假设每个ID都有一个9个字符的标识符和至少一个(或多个)4个字符的标识符。因此,您将使用IDENT9查询作为基础创建一个包含9个字符ID的主表,以及一个“从属”4个字符的ID表。使用这些表,您可以在数据库级别创建约束,强制执行重复检查