Сегодня я столкнулся с интересной проблемой SQL, и хотя я нашел решение, которое работает, я сомневаюсь, что это лучший или самый эффективный ответ. Я полагаюсь на экспертов здесь - помогите мне узнать что-то и улучшить мой запрос! СУБД - это SQL Server 2008 R2, запрос является частью отчета SSRS, который будет работать с примерно 100 000 строк.
По сути, у меня есть список идентификаторов, которые могут иметь несколько значений, связанных с ними, значения Да, Нет, или некоторые другие строки. Для идентификатора x, если любое из значений является Да, x должно быть Да, если они все Нет, это должно быть Нет, если они содержат какие-либо другие значения, кроме Да и Нет, отобразить это значение. Я хочу вернуть только 1 строку для каждого идентификатора, без дубликатов.
Упрощенная версия и контрольный пример:
DECLARE @tempTable table ( ID int, Val varchar(1) )
INSERT INTO @tempTable ( ID, Val ) VALUES ( 10, 'Y')
INSERT INTO @tempTable ( ID, Val ) VALUES ( 11, 'N')
INSERT INTO @tempTable ( ID, Val ) VALUES ( 11, 'N')
INSERT INTO @tempTable ( ID, Val ) VALUES ( 12, 'Y')
INSERT INTO @tempTable ( ID, Val ) VALUES ( 12, 'Y')
INSERT INTO @tempTable ( ID, Val ) VALUES ( 12, 'Y')
INSERT INTO @tempTable ( ID, Val ) VALUES ( 13, 'N')
INSERT INTO @tempTable ( ID, Val ) VALUES ( 14, 'Y')
INSERT INTO @tempTable ( ID, Val ) VALUES ( 14, 'N')
INSERT INTO @tempTable ( ID, Val ) VALUES ( 15, 'Y')
INSERT INTO @tempTable ( ID, Val ) VALUES ( 16, 'Y')
INSERT INTO @tempTable ( ID, Val ) VALUES ( 17, 'F')
INSERT INTO @tempTable ( ID, Val ) VALUES ( 18, 'P')
SELECT DISTINCT t.ID, COALESCE(t2.Val, t3.Val, t4.Val)
FROM @tempTable t
LEFT JOIN
(
SELECT ID, Val
FROM @tempTable
WHERE Val = 'Y'
) t2 ON t.ID = t2.ID
LEFT JOIN
(
SELECT
ID, Val FROM @tempTable
WHERE Val = 'N'
) t3 ON t.ID = t3.ID
LEFT JOIN
(
SELECT ID, Val
FROM @tempTable
WHERE Val <> 'Y' AND Val <> 'N'
) t4 ON t.ID = t4.ID
Заранее спасибо.