1

次のようなデータを含むSQLServer2000のテーブルがあります。

ReferenceNumber    ReferenceValue
00001              Not assigned
00002              Not assigned
00002              ABCDE

ここで、各ReferenceNumberは、ReferenceValueが「未割り当て」または真のReferenceValueのいずれかで、テーブルに複数回表示される可能性があります。

ReferenceNumberごとに1行だけで、存在する場合は真のReferenceValue、真のReferenceValueが存在しない場合は「未割り当て」のクリーンアップされたテーブルにデータをダンプしたいと思います。

私は2つのクエリでそれを行う方法を見ることができます:

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の場合、これがおそらく最も簡単です。最初の句=「実際の」値、最初の句にない場合は2番目の句。そしてあなたのアイデアの延長。

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つを選択しますか?

于 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にしたくないものを変換し、次にMAX()を変換してから、NULLをダミー値に変換し直します。

インラインのワンパスでは、これ以上効率を上げることはできません。

于 2009-10-22T19:26:38.093 に答える