Выбор с предпочтением в SQL Server - PullRequest
1 голос
/ 22 октября 2009

У меня есть таблица в 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)

но я думаю, что должен быть лучший способ. Есть идеи?

Ответы [ 2 ]

2 голосов
/ 22 октября 2009

Примерно так:

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

MAX () игнорирует NULL, поэтому сначала преобразуйте все, что вы не хотите, в NULL, затем MAX (), а затем преобразуйте NULL в фиктивное значение.

Один проход, in-line, не может быть намного эффективнее.

2 голосов
/ 22 октября 2009

Для 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')

Однако, по каким критериям вы хотите связать разрыв между «истинными» эталонными значениями? или просто выбрать один?

...