2013-03-07 4 views
1

Предположим, у меня есть следующая таблица:Выберите Distinct, Заказывайте невозвращенного Ошибка Колонка

Col_A: Col_B: Col_C: 
Item1  Value1 A 
Item2  Value2 B 
Item3  Value3 A 
Item4  Value4 B 
Item5  Value5 A 
Item1  Value1 A 

сейчас, что я ищу, чтобы получить обратно есть Distinct значения от Col A & Col B заказанный Col C затем Col A, так результат будет выглядеть следующим образом:

Col_A: Col_B: 
Item1  Value1 
Item3  Value3 
Item5  Value5 
Item2  Value2 
Item4  Value4 

SQL, я намеревался использовать для этого было:

SELECT DISTINCT [Col_A], [Col_B] 
FROM [MyTable] 
     WHERE ... 
ORDER BY [Col_C] ASC, [Col_A] ASC 

Но я получаю ошибку:

ORDER BY items must appear in the select list if SELECT DISTINCT is specified. 

Я понимаю, почему ошибка происходит и фигура, я мог бы решить эту проблему с довольно сложной SQL/КТР, но я надеюсь, что есть хороший, чистый & effienct способ, чтобы написать SQL, чтобы получить результат, я ищу ...

+0

Если вы не против вложенного подзапроса, это простое исправление. –

+0

Что произойдет, если у вас есть такая строка: ''Item1', 'Value1', 'D'' ?, она конфликтует с предыдущей, так как она имеет другое значение для 'Col_C' – Lamak

+0

SELECT [Col_A], [Col_B ] FROM (ваш запрос) – Jesse

ответ

4

У вас нет col_c в вашей статье select. С помощью distinct вы можете заказывать только по столбцам, указанным в инструкции select.

Вместо этого, вы должны использовать group by заявление:

select col_a, col_b 
from t 
group by col_a, col_b 
order by max(col_c), col_a 

В самом деле, select distinct не надо вообще в SQL. Это синтаксическая короткая команда для группировки по всем переменным.

+0

Это сработало СОВЕРШЕННО !!!!! Спасибо СООО МНОГО !!! –

+1

Отличное решение! Одна вещь: я думаю, что ей нужен порядок от 'min (col_c)', а не 'max', что дает точный порядок, который искали Джон. –

+0

Согласен, +1, я использовал '' CASE'' в 'ORDER BY', но я никогда не использовал агрегированный столбец. Делает совершенное чувство, которое вы могли бы, просто никогда не было. –

2

Я думаю, что это прямо сейчас ...

SELECT [Col_A], [Col_B] 
FROM (SELECT [Col_A], [Col_B], Min([Col_C]) As bah 
     FROM [MyTable] 
     WHERE ... 
     Group By [Col_A], [Col_B]) n 
ORDER BY bah ASC, [Col_A] ASC 
+0

Это ДОЛЖНО быть в порядке, моя единственная ** небольшая ** оговорка - это то, что если для 'ColA'' ColB'' ColC'' есть отдельная запись, но когда вы удаляете 'ColC', вы получаете дубликат? –

+0

Да, это правда. –

+0

Это работает, но я поддержал @ GordonLinoff, потому что его лучше. –

0

Выберите col_a, col_b фр ом yourtable группы по col_a, col_ б Сортировать по мин (col_c), col_a

К сожалению я пропустил заказ

+0

Прошу прощения, я не понимаю вашего ответа ... Где порядок 'Order By' вписывается? –

+0

@johnbustos i обновленный ответ, но я думаю, что я опаздываю. К сожалению, я пропустил заказ – DevelopmentIsMyPassion

+0

Можете вы точно объяснить, что делает 'ORDER BY min (col_c)'? –

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