2009-10-22 4 views
1

У меня есть таблица в SQL Server 2000 с данными, похожими на следующее:Выбор с предпочтением в SQL Server

ReferenceNumber ReferenceValue 
00001    Not assigned 
00002    Not assigned 
00002    ABCDE 

, в котором каждый ReferenceNumber может появляться несколько раз в таблице, либо с ReferenceValue из «Не присваивается "или true ReferenceValue.

Я хочу сбросить данные в очищенную таблицу только с одной строкой на номер ReferenceNumber и true 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

Что-то вроде этого:

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

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

Один проход, в линию, не может стать намного более эффективным.

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

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

+0

Для этой конкретной проблемы ссылочный номер будет либо «Не назначен», либо имеет уникальный ReferenceValue, поэтому проблем со связями нет. – taserian

+0

@taserian: удалил мой агрегат – gbn

+0

Я сохранил совокупность, поскольку хотя RefNumber может иметь один истинный RefValue, эта пара RefNumber-RefValue может появляться несколько раз в таблице. – taserian

Смежные вопросы