在SQL Server中使用首选项进行选择

在SQL Server中使用首选项进行选择,sql,sql-server,tsql,sql-server-2000,no-duplicates,Sql,Sql Server,Tsql,Sql Server 2000,No Duplicates,我在SQL Server 2000中有一个表,其数据类似于以下内容: ReferenceNumber ReferenceValue 00001 Not assigned 00002 Not assigned 00002 ABCDE 其中每个ReferenceNumber可以在表中多次出现,ReferenceValue为“Not assigned”或为true ReferenceValue 我想将数据转储到一个已

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

ReferenceNumber    ReferenceValue
00001              Not assigned
00002              Not assigned
00002              ABCDE
其中每个ReferenceNumber可以在表中多次出现,ReferenceValue为“Not assigned”或为true ReferenceValue

我想将数据转储到一个已清理的表中,每个ReferenceNumber只有一行,如果存在,则为true ReferenceValue;如果没有true ReferenceValue,则为“Not assigned”

我可以通过两个查询了解如何执行此操作:

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)

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

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

然而,您希望用什么标准来连接真实参考值之间的中断?或者选择一个?

对于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')
然而,您希望用什么标准来连接真实参考值之间的中断?还是选一个?

类似这样的:

SELECT 
  ReferenceNumber
, ReferenceValue = ISNULL(MAX(NULLIF(ReferenceValue,'Not assigned')),'Not assigned')
INTO Table1_Clean
FROM Table1
GROUP BY
  ReferenceNumber
MAX忽略空值,所以先转换不希望为空的值,然后转换MAX,然后将空值转换回伪值

一次在线传递的效率再高不过了。

类似这样的东西:

SELECT 
  ReferenceNumber
, ReferenceValue = ISNULL(MAX(NULLIF(ReferenceValue,'Not assigned')),'Not assigned')
INTO Table1_Clean
FROM Table1
GROUP BY
  ReferenceNumber
MAX忽略空值,所以先转换不希望为空的值,然后转换MAX,然后将空值转换回伪值


一次串联传递的效率不会更高。

对于这个特定问题,ReferenceNumber要么“未分配”,要么具有唯一的ReferenceValue,因此没有关系。@taserian:删除了我的聚合我保留了聚合,因为即使RefNumber可以有一个真正的RefValue,该RefNumber RefValue对可以在表中多次出现。这是三次读取和一次自联接,您只需要一次读取而不需要联接。@gbn:您在建议此方法时是否考虑了并行执行?对于此特定问题,ReferenceNumber将具有“未分配”或唯一的ReferenceValue,因此,关系没有问题。@taserian:删除了我的聚合我保留了聚合,因为即使一个RefNumber可以有一个真正的RefValue,该RefNumber-RefValue对也可以在表中出现多次。这是三次读取和一次自连接,您只需要一次读取而不需要连接。@gbn:您在建议此方法时考虑过并行执行吗?