1

我在 SQL Server 2000 中有一个表,其数据类似于以下内容:

ReferenceNumber    ReferenceValue
00001              Not assigned
00002              Not assigned
00002              ABCDE

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

我想将数据转储到一个清理表中,每个 ReferenceNumber 只有一行,如果存在则为 true ReferenceValue,如果没有 true 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)

但我认为必须有更好的方法。有任何想法吗?

4

2 回答 2

2

对于 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')

但是,您希望在“真实”参考值之间使用什么标准?还是随便挑一个?

于 2009-10-22T19:26:15.840 回答
2

像这样的东西:

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 转换回虚拟值。

一次通过,在线,不能提高效率。

于 2009-10-22T19:26:38.093 回答