代码之家  ›  专栏  ›  技术社区  ›  taserian

在SQL Server中按首选项选择

  •  1
  • taserian  · 技术社区  · 16 年前

    ReferenceNumber    ReferenceValue
    00001              Not assigned
    00002              Not assigned
    00002              ABCDE
    

    其中每个ReferenceNumber可以在表中多次出现,ReferenceValue为“未分配”或为真ReferenceValue。

    我想将数据转储到一个清理过的表中,每个ReferenceNumber只有一行,如果存在,则有一个真正的ReferenceValue,如果没有真正的ReferenceValues,则为“未分配”。

    我可以通过两个查询来了解如何做到这一点:

    SELECT TOP 1 ReferenceNumber, ReferenceValue
    INTO clean
    FROM duplicates
    WHERE ReferenceValue <> 'Not assigned'
    
    INSERT INTO clean(ReferenceNumber, ReferenceValue)
    SELECT TOP 1 ReferenceNumber, ReferenceValue
    WHERE ReferenceValue = 'Not assigned' 
    AND ReferenceNumber NOT IN (SELECT ReferenceNumber FROM clean)
    

    但我想一定有更好的办法。有什么想法吗?

    2 回复  |  直到 16 年前
        1
  •  2
  •   Peter Radocchia    16 年前

    大致如下:

    SELECT 
      ReferenceNumber
    , ReferenceValue = ISNULL(MAX(NULLIF(ReferenceValue,'Not assigned')),'Not assigned')
    INTO Table1_Clean
    FROM Table1
    GROUP BY
      ReferenceNumber
    

    MAX()忽略NULL,因此先将任何不想转换为NULL的值转换为NULL,然后是MAX(),然后将NULL转换回虚拟值。

        2
  •  2
  •   gbn    16 年前

    对于SQL SERVER 2000,这可能是最简单的。第一个子句=“实数”值,第二个子句在第一个子句中找不到。以及你想法的延伸。

    SELECT d2.ReferenceNumber, d2.ReferenceValue
    FROM duplicates d2
    WHERE d2.ReferenceValue <> 'Not assigned'
    UNION ALL
    SELECT d1.ReferenceNumber, d1.ReferenceValue
    FROM duplicates d1
    WHERE NOT EXISTS (SELECT *
             FROM duplicates d2
             WHERE d2.ReferenceNumber = d1.ReferenceNumber AND
                     d2.ReferenceValue <> 'Not assigned')