2010-12-05 7 views
2

Мне нужно вернуть только 1 строку на конкретную запись в базе данных. Напр. если у меня есть:SQL SELECT DISTINCT и GROUP BY problem

ID col1 col2 
1 1 A 
2 1 B 
3 1 C 
4 2 D 
5 3 E 
6 4 F 
7 4 G 

в MySQL я могу выполнить запрос

SELECT DISTINCT col1, col2 FROM table GROUP BY col1 

и я буду получать ->

ID col1 col2 
1 1 A 
4 2 D 
5 3 E 
6 4 F 

чего я хочу, но если я бегу то же самое запрос в SQL Server. Я получаю сообщение об ошибке.

Итак, в основном мне нужно возвращать только ОДИН (или ПЕРВЫЙ) «col1» И его «col2» из каждой строки в таблице.

Что было бы правильным синтаксисом для SQL Server?

Благодарим вас за внимание!

Андрей

EDIT:

полный запрос, который работает в MySQL есть ->

SELECT DISTINCT list_order, category_name, category_id 
FROM `jos_vm_category` 
WHERE `category_publish` = 'Y' 
GROUP BY list_order 

так, ДЛЯ КАЖДОЙ "list_order" номер я хочу вернуть category_name и CATEGORY_ID от этого строка и игнорировать каждую другую строку с тем же номером «list_order»

+0

@marc_s: Я думаю, что ошибка, которую получает OP, заключается в том, что SQL Server требует, чтобы все поля SELECT отображались в предложении GROUP BY, если они не являются частью агрегатной функции. MySQL этого не требует. – 2010-12-05 18:18:35

+0

в MSSQL ошибка «Столбец» jos_vm_category.category_id «недопустим в списке выбора, потому что он не содержится ни в агрегатной функции, ни в предложении GROUP BY». – Andrej 2010-12-05 18:20:33

ответ

2

Другой подход заключается в использовании функции ROW_NUMBER() в T-SQL, которая все вам нужно «разбить» свои данные на что-то - например, на ваш col1 - и получить инкрементные номера для каждого из этих разделов данных. Если вы хотите только первую запись для каждого «раздела», просто запросить его таким образом (с помощью Common Table Expression - КТР):

;WITH Distincts AS 
(
    SELECT ID, col1, col2, 
     ROW_NUMBER() OVER (PARTITION BY col1 ORDER BY ID) AS 'RowNo' 
    FROM dbo.Table 
) 
SELECT 
    ID, col1, col2 
FROM 
    Distincts 
WHERE 
    RowNo = 1 

Это дает мне выход, который вы ищете.

0

Вы можете получить все строки, соответствующие первый экземпляр значения в col1 следующие

SELECT col1, col2 
FROM table t1 
where not exists 
     (select 1 
     from table t2 
     where t2.col1 = t1.col1 and 
       t2.id < t1.id) 

EDIT: отправляющей сравнение запросов alt text

EDIT2: Проводка сравнения фактического запроса план выполнения с примерно 2000 строк данных, генерируемых случайным образом, и с идентификатором, являющимся столбцом идентификации с уникальным индексом. Второй индекс для id и col1. alt text

Оказалось, что запрос Марка быстрее в конце концов, по крайней мере, с этими данными!