我在SQL Server 2000中有一个表,其数据类似于以下内容:
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)
但我认为必须有更好的方法。有什么想法吗?
答案 0 :(得分: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')
但是,您希望在“真实”参考值之间打破什么标准?或者只选一个?
答案 1 :(得分:2)
这样的事情:
SELECT
ReferenceNumber
, ReferenceValue = ISNULL(MAX(NULLIF(ReferenceValue,'Not assigned')),'Not assigned')
INTO Table1_Clean
FROM Table1
GROUP BY
ReferenceNumber
MAX()忽略NULL,所以先将你想要的东西转换为NULL,然后再转换为MAX(),然后将NULL转换回虚拟值。
一次通过,无法提高效率。